2015-08-31 2 views
0

Привет, я новичок в OOP и python. В настоящее время я пытаюсь увеличить переменную User Id из дочернего класса, когда создаю экземпляр родительского класса с использованием наследования, t, похоже, распознает переменную Id из своего родительского класса. Пример здесьПытается увеличивать переменную на ее наследование python

class User: 
    _ID = 0 
    def __init__(self, name): 
     self.name = name 
     self.id = self._ID 
     self.__class__._ID += 1 

class Customer(User): 
    def __init__(self, name): 

    def lastname(self): 

     return "self.name.split()[-1]" 

Если я сделать я могу получить доступ к атрибуту класса

>> Chris = User("Christopher Allan") 
>> Chris.id 
>> 0 

Когда я пытаюсь запустить

>> Andy = Customer('Andy Smith') 
>> Andy.id 

>> Traceback (most recent call last): 
    File "<pyshell#83>", line 1, in <module> 
    Andy.id 
    AttributeError: 'Customer' object has no attribute 'id' 

Update

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

+0

не может воспроизвести, кажется работать отлично для меня. Какая версия python? – lemonhead

+1

Вместо 'self .__ class __._ ID + = 1' Я бы использовал' User._ID + = 1'. – pasztorpisti

+0

Значит, вы определенно не переопределяете '__init__' в классе' Customer'? – 101

ответ

1

Customer не имеет атрибут id как базовый класс (User) никогда не имеет его метод __init__ называется, и вы иначе не определяя его. Так как вы перекрывая базовый класс __init__ метода также необходимо вызвать super так, что унаследованный код также называют:

class Customer(User): 
    def __init__(self, name): 
     super(Customer, self).__init__(name) 
+0

Спасибо за хорошее объяснение. – cyclopse87

+2

Стоит отметить, что если ваш метод '__init__' фактически не делает * ничего * (кроме вызова' super() .__ init__', вы также можете его не иметь. Если вы не переопределите метод, унаследованная версия будет вызвана вместо этого. – Blckknght

1

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

>>> class User: 
...   _ID = 0 
...   def __init__(self, name): 
...     self.name = name 
...     self.id = self._ID; self.__class__._ID += 1 
... 
>>> class Customer(User): 
...  pass 
... 
>>> Andy = Customer('Andy Smith') 
>>> Andy.id 
0 
>>> import sys 
>>> import sys 
>>> sys.version 
'2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54) \n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]' 
>>> 

>>> class User: 
...   _ID = 0 
...   def __init__(self, name): 
...     self.name = name 
...     self.id = self._ID; self.__class__._ID += 1 
... 
>>> class Customer(User): 
...  pass 
... 
>>> Andy = Customer('Andy Smith') 
>>> Andy.id 
0 
>>> import sys 
>>> sys.version 
'3.4.0b2 (v3.4.0b2:ba32913eb13e, Jan 5 2014, 11:02:52) \n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]' 
>>> 
+0

Моя ошибка, что код действительно работает, я только что протестировал его сейчас, в коде, который не работал для меня. У меня был классный метод в классе клиентов, и именно по этой причине он не работал для меня, поскольку я не включал def __init __ (self, name): super (Customer, self) .__ init __ (имя), спасибо за вашу попытку помочь мне, тем не менее. – cyclopse87

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