2016-09-23 4 views
1

Я пытаюсь определить self.data внутри класса наследует от классаКак добавить исходное определение класса python, наследуемого от другого класса?

class Object(): 
    def __init__(self): 
     self.data="1234" 

class New_Object(Object): 
    # Code changing self.data here 

Но я столкнулся с проблемой.

class Object(): 
    def __init__(self): 
     self.data="1234" 

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

В оригинале экземпляр упоминается как «self» внутри класса, и он определяется как «я» внутри определения __init__.

class New_Object(Object): 
    # Code changing self.data here 

Так что, если я хотел, чтобы наследовать от класса Object, но определить self.data внутри New_Object, я думал, что я должен определить __init__ в New_Object, но это переопределяет __init__ от New_Object

Есть любым способом я мог сделать это без copypasting __init__ от Object?

+2

Любые изменения будут полезны, я ужасен в терминологии и формулируя то, что я имею в виду. –

+1

Обратите внимание, что 'self' является * экземпляром класса, а не самим классом. – MisterMiyagi

+1

@MisterMiyagi Ах, спасибо, что сообщили мне. –

ответ

3

Вы используете super, чтобы вызвать первоначальную реализацию.

class New_Object(Object): 
    def __init__(self): 
     super(NewObject, self).__init__() 
     self.info = 'whatever' 
2

Вот что super для:

class NewObject(Object): 

    def __init__(self): 
     super(NewObject, self).__init__() 
     # self.data exists now, and you can modify it if necessary 
1

Вы можете использовать super().__init__() позвонить Object.__init__() из New_Object.__init__().

Что вы могли бы сделать:

class Object: 
    def __init__(self): 
     print("Object init") 
     self.data = "1234" 

class New_Object(Object): 
    def __init__(self): 
     print("calling super") 
     super().__init__() 
     print("data is now", self.data) 
     self.data = self.data.split("3") 

o = New_Object() 

# calling super 
# Object init 
# data is now 1234 

Обратите внимание, что вы не должны давать какие-либо аргументы super(), до тех пор, как вы используете Python 3.

1

Ответ в том, что вы называете суперкласса __init__ явно в подклассе __init__. Это можно сделать одним из двух способов:

Object.__init__(self) # requires you to name the superclass explicitly 

или

super(NewObject, self).__init__() # requires you to name the subclass explicitly 

Последнее также требует, чтобы убедиться, что вы используете «новый стиль» класс: в Python 3, это всегда так , но в Python 2 вы обязательно должны унаследовать от встроенного класса object. В Python 3, что на самом деле может быть выражена еще проще:

super().__init__() 

Лично в большинстве своем коде «невыгодное» от того, чтобы назвать суперкласс явно не недостаток вовсе, а Object.__init__() придает прозрачность, так как это делает это абсолютно ясно, что называется. Это связано с тем, что большая часть моего кода относится только к одному наследованию. Маршрут super приходит в свои руки, когда у вас есть множественное наследование.См What does 'super' do in Python?

Python 2 пример:

class Object(object): 
    def __init__(self): 
     self.data = "1234" 

class NewObject: 
    def __init__(self): 
     # subclass-specific stuff 
     super(NewObject, self).__init__() 
     # more subclass-specific stuff