не может разобраться в множественном наследовании в Python3 - PullRequest
0 голосов
/ 07 октября 2018

Документация гласит:

Python supports a form of multiple inheritance as well. A class 
definition with multiple base classes looks like this:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
For most purposes, in the simplest cases, you can think of the search 
for attributes inherited from a parent class as depth-first, left-to-
right, not searching twice in the same class where there is an overlap 
in the hierarchy. Thus, if an attribute is not found in 
DerivedClassName, it is searched for in Base1, then (recursively) in 
the base classes of Base1, and if it was not found there, it was 
searched for in Base2, and so on.

Итак, у меня есть этот код для проверки:

class Class1:
        c1_1 = 1.1

class Class2:
        c2_1 = 2.1


class Blob(Class1, Class2):

    def dump():
        print('c1_1 = ' + str(c1_1))

Blob.dump()

Но я получаю это:

Traceback (most recent call last):
  File "classinherit.py", line 13, in <module>
    Blob.dump()
  File "classinherit.py", line 11, in dump
    print('c_1.1 = ' + str(c1_1))
NameError: name 'c1_1' is not defined

Документация, кажется, говорит, что Python сначала будет искать (в данном случае общеклассовую) переменную в области видимости класса Blob, и, не найдя ее, будет искать классы Class1 и Class2 ... но этого явно не происходит.

Что дает?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

То, что вы делаете, это то, что вы пытаетесь получить доступ к переменным класса и (или) атрибутам , фактически не сообщая, к какому классу он принадлежит или не ссылаясь на класс. Вы можете увидеть ответ @Mike Scotty.или просто правильно вызовите переменные вашего класса, тогда вы сможете ясно увидеть, как работает MRO (Порядок разрешения методов) в Python.

class A:
    a = 8

class B:
    b = 9

class C(A, B):
    c = 99

Вывод

d = C() #After instantiating
print(d.a, d.b, d.c)
>> 8 9 99
# Without instantiating
print(C.a, C.b, C.c)
>> 8 9 99
0 голосов
/ 07 октября 2018

Если вы хотите получить доступ к переменным класса, вы должны как-то ссылаться на класс:

class Class1:
        c1_1 = 1.1

class Class2:
        c2_1 = 2.1

class Blob(Class1, Class2):

    @classmethod
    def dump(cls):
        print('c1_1 = ' + str(cls.c1_1))

Blob.dump()

Чтобы прояснить ситуацию, вы должны ссылаться на класс всегда , а не простов случае наследования.

Например, следующее не сработает:

class Klass():
    v1 = 1

    def dump():
        print('class var = ' + str(v1))

Klass.dump()

NameError: имя 'v1' не определено

Опять же, вам нужно будет сослаться на класс, чтобы он работал:

class Klass():
    v1 = 1

    @classmethod
    def dump(cls):
        print('class var = ' + str(cls.v1))

Klass.dump()

Если вы не хотите использовать @classmethod, вы также можете сделать следующее:

class Klass():
    v1 = 1

    def dump():
        print('class var = ' + str(Klass.v1))

Klass.dump()

Но имейте в виду, что изменение имени класса Klass также потребует изменения Klass.v1.

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