Как получить доступ к методу класса и переменной класса из класса в метод экземпляра другого класса в Python? - PullRequest
0 голосов
/ 30 марта 2020

Представьте, что у меня есть три класса, как показано во фрагменте кода.

В классе A у меня есть переменная класса и метод класса, к которому я хотел бы обратиться в классе C после множественного наследования, т. Е. C (A, B) где B - просто другой класс. Я обнаружил, что могу получить доступ как к методу класса, так и к переменной с помощью self. , super (). или с помощью использования имени класса его self, то есть A.

Вопрос в том, каким может быть рекомендуемый способ доступа, если таковой имеется. Или все три одинаково хороши? Заранее спасибо. С уважением, DS

class A():
    school='XYZ'
    def __init__(self):
        print('in init A')
    def feature1(self):
        print('Feature1-A working')
    def feature2(self):
        print('Feature2-A working')

    @classmethod
    def show_avg(cls,m1,m2,m3):
        return (m1+m2+m3)/3
    @classmethod
    def info(cls):
        return cls.school

class B():
    def __init__(self):
        print('in init B')
    def feature3(self):
        print('Feature1-B working')
    def feature4(self):
        print('Feature2-B working')

class C(A,B):
    def __init__(self):
        super().__init__()
        print('in init C') 
    def get_avg_from_super_class(self):
        avg1=self.show_avg(2,3,4)
        avg2=super().show_avg(2,3,4)
        avg3=A.show_avg(2,3,4)
        print('avg by calling self:{}, avg by calling super():{}, avg by alling class name:{}'.format(avg1,avg2,avg3))
    def get_info(self):
        print (A.info())
        print(self.info())
        print(super().info())

1 Ответ

1 голос
/ 30 марта 2020

Для вашего кода любой из трех способов работает нормально.
Но в целом, я бы сказал, использование имени класса для доступа к методам класса и переменным класса - это самый безопасный способ обеспечить доступ к правильным методам / переменным.

Например,

1. Если у вас есть другой info() в классе C, будь то метод класса или метод экземпляра,

self.info()

вызовет этот метод, определенный в классе C, а НЕ тот, который в классе A

2. Если порядок наследования отличается от class C(B, A), и у вас есть другой info() в классе B, будь то метод класса или метод экземпляра ,

super().info()

вызовет этот метод, определенный в классе B, НЕ тот, кто в классе A

...