Наследовать метод sub в Python - PullRequest
3 голосов
/ 02 декабря 2011

Я бы хотел наследовать «подметод» метода в python. Может ли кто-нибудь помочь мне разобраться, как это сделать, пожалуйста?

Пример того, что я хочу сделать:

 class A(object):
    def method(self, val):
        def submethod():
            return "Submethod action"
        if not val:
            return submethod()  
        return "Method action"


a = A()

class B(A):
    def method(self, val):
        #inherit submethod ?        
        def submethod():
            return "Another submethod action"

        return super(B,self).method(val)

b = B()
print "A : "
print a.method(True)
>> Method action
print a.method(False)
>> Submethod action
print "B : "
print b.method(True)
>> Method Action
print b.method(False)
Actual answer : 
>> Submethod Action
**Wanted answer : 
>> Another submethod action**

С уважением,

Квентин

Ответы [ 2 ]

4 голосов
/ 02 декабря 2011

Вы не можете "наследовать" submethod, поскольку он локальный для method и даже не существует до тех пор, пока не будет запущен method.

Почему бы просто не сделать его методом верхнего уровняA и B?

2 голосов
/ 02 декабря 2011

Это называется замыканием (функцией внутри функции) и не совсем ведет себя так, как вы просите.Поскольку функции не похожи на классы, у них нет понятия «экземпляры», и поэтому любые объекты, внутренние для функции, не доступны извне, если они не return редактируются функцией.

NB, InМетоды Python - это, по сути, функции, связанные с классом.

Это был бы лучший шаблон:

class A(object):
    def method(self, val):
        if not val:
            return self.submethod()
        return "Method action"

    def submethod():
        return "Submethod action"

Вы можете получить доступ к внутреннему состоянию замыканий, но это не то же самое, что атрибут-стиль доступа вы думаете.Лучше избегать их, пока вы полностью не поймете, как работают пространства имен Python и прочее, а также хлам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...