2017-01-30 2 views
0

Я новичок в Python, поэтому, пожалуйста, несите меня, если вопрос очень прост для вас.Невозможно распечатать переменную дочернего класса при перегрузке метода

Может кто-нибудь объяснить, почему переменная класса, имя, в классе Dog вызывает ошибку в следующем примере? Для меня не имеет значения, что d.name нормально называть, но d.eat() не подходит для перегрузки метода. Большое вам спасибо за вашу помощь!

class Animal:   # parent class 
    name = 'Animal' 
    def eat(self): 
     print "Animal eating" 
class Dog(Animal):  # child class 
    name = 'Dog' 
    def eat(self): 
     print name 

d = Dog() 
print d.name # OK 
d.eat()  # Error ! 
+0

Смотрите также: http://stackoverflow.com/questions/14299013/namespaces-within-a-python-class –

ответ

3

Поскольку name является переменной-члена класса, а не глобальной, ни локальной переменной, то нужно оператору . искать его. Попробуйте один из них:

print self.name 
    print Dog.name 

Какой из них вы будете использовать, зависит от других аспектов вашего дизайна программы. Первый попытается найти name в текущем объекте, при необходимости возвращаясь к определению класса. Второй всегда будет использовать определение класса.

+0

Пожалуйста, выделите разницу между эти два '.name', потому что они огромны. – 9000

+0

@ 9000 - Спасибо. –

0

Причина вашей ошибки заключается в том, что вы не можете определить метод с именем переменной в этой области. Если вы сделаете это, то вы не будете иметь ошибку:

class Animal:   # parent class 
    name = 'Animal' 
    def eat(self): 
     print "Animal eating" 
class Dog(Animal):  # child class 
    name = 'Dog' 
    def eat(self): 
     # name does not exist within this scope 
     print self.name 
d = Dog() 
print d.name # OK 
d.eat()  # No longer an error! 
Смежные вопросы