2013-02-20 2 views
0

Я озадачен python, тем больше я попадаю в него.python доступ к атрибутам, переопределенным в производных классах

Например, следующий код:

class A: 
    def __init__ (self): 
     self.test = "a" 

    def dump(self): 
     print("A.test: %s" % (self.test,)) 
     print("A.test: %s" % (self.__dict__["test"],)) 
     print("A.test: %s" % (getattr(self, "test"),)) 
     print() 

class B (A): 
    def __init__ (self): 
     self.test = "b" 

    def dump(self): 
     print("B.test: %s" % (self.test,)) 
     print("B.test: %s" % (self.__dict__["test"],)) 
     print("B.test: %s" % (getattr(self, "test"),)) 
     print() 


o = B() 
o.dump() 
A.dump(o) 
super(B, o).dump() 

печатает:

B.test: b 
B.test: b 
B.test: b 

A.test: b 
A.test: b 
A.test: b 

A.test: b 
A.test: b 
A.test: b 

, который, кажется, чтобы показать, что вы можете вызвать функцию базового класса, но если этот класс имеет атрибут, который был также используемый в каком-либо производном классе, вы не можете получить доступ к этому атрибуту, используя стандартную нотацию object.atribute или, возможно, вы вообще не можете получить к ней доступ.

Действительно ли это так? Если это так, то это будет убивать - IMHO - целая модель объекта python.

+0

Нет, вы не можете получить к нему доступ вообще. Возможно, вам следует углубиться в целую идеологию класса Python.Это немного отличается от языков, таких как C++ и C# – dmg

+0

Тот факт, что вы наблюдаете, никоим образом не вредит объектной модели Python. Это, по сути, довольно центрально. – delnan

ответ

6

o является примером B, а не A. Когда он инициализируется, он устанавливает значение своего атрибута test в «b». Ни в коем случае нельзя назвать суперкласс __init__, поэтому он никогда не будет установлен в «a», но даже если вы это сделали, он может иметь только одно из значений «a» или «b», в зависимости от того, вы сначала вызвали super или второй.

Не знаю, почему вы думаете, что это разбивает объектную модель Python.

0

Вы говорите

, если этот класс имеет атрибут, который также был использован в некоторых полученных класса

В определении А

class A: 
    def __init__ (self): 
     self.test = "a" 

не означает, что объект test имени test создан как атрибут класса A
Это означает, что каждый раз, когда объект будет реализованным, атрибут тест будет creted в ИНСТАНЦИИ

Таким образом, вы не можете иметь надежду на доступ к атрибуту, который не существует.

def A: 
    attA = 13 

делает создает объект как атрибут A: print(A.attA) напечатает значение

0

Это то, что вы ищете?

class A(object): 
    def __init__ (self): 
     self.__test = "a" 

    def dump(self): 
     print "A.test:", self.__test 

class B (A): 
    def __init__ (self): 
     super(B, self).__init__() 
     self.__test = "b" 

    def dump(self): 
     print "B.test:", self.__test 


o = B() 
o.dump() 
super(B, o).dump() 

выход:

B.test: b 
A.test: a 

(с использованием Python 2, но вы получите идею ..)

Это работает потому, что Python делает некоторые фантазии имя-коверкая с псевдо-частного __variables.

Смежные вопросы