Python类继承问题
我在玩Python类继承时遇到了一个问题,即如果从子类(下面的代码)调用继承的Python类继承问题,python,class,inheritance,Python,Class,Inheritance,我在玩Python类继承时遇到了一个问题,即如果从子类(下面的代码)调用继承的\uuuuu init\uuuu,则不会执行该继承的 员工必须显式调用父级的_init _;(非init): 您应该明确地调用超类的init函数: class Employee(Person): def __init__(self): Person.__init__(self) self.empnum = "abc123" 三件事: 您需要显式调用构造函数。它不像在C中那样自
\uuuuu init\uuuu
,则不会执行该继承的
员工必须显式调用父级的_init _;(非init):
您应该明确地调用超类的init函数:
class Employee(Person):
def __init__(self):
Person.__init__(self)
self.empnum = "abc123"
三件事:
您需要显式调用构造函数。它不像在C中那样自动为您调用++
使用从对象继承的新样式类
对于新样式的类,请使用可用的super()方法
这将看起来像:
class Person(object):
AnotherName = 'Sue Ann'
def __init__(self):
super(Person, self).__init__()
self.FirstName = 'Tom'
self.LastName = 'Sneed'
def get_name(self):
return self.FirstName + ' ' + self.LastName
class Employee(Person):
def __init__(self):
super(Employee, self).__init__()
self.empnum = 'abc123'
def get_emp(self):
print self.AnotherName
return self.FirstName + ' ' + 'abc'
建议使用super,因为它还可以正确处理在多继承情况下仅调用一次构造函数(只要继承图中的每个类也使用super)。如果/当您更改一个类的继承内容时(例如,您去掉了一个基类并更改了派生,并且不需要担心您的类调用错误的父构造函数),您也就不需要在这里更改代码了。同样在MI前端,您只需要一个超级调用就可以正确调用所有基类构造函数。而不是super(class,instance)
模式为什么不直接使用super(instance)
,因为类总是实例
是否存在不属于实例的特定情况。\uuuu class\uuuuu
?使用super时必须小心,请阅读以下内容:+1以推荐新样式的类,特别是OP的堆栈跟踪表明它们使用的是Python 2.6。如果super类没有init,是否存在问题?如果是这样,这是否意味着超类不能是一个“黑匣子”?没有问题的超类没有init。这简直是黑箱操作。很高兴知道这些陷阱。到目前为止,我一直非常小心,我所有的python代码都调用super(),一直到object:)这都很有效——但为什么呢?为什么继承的类的工作方式与您将其实例化为自己的对象时不同?在实例化子类时,Python不会自动调用超类的init函数。这个责任留给程序员。我不知道这背后是否有道理。我想它抹掉了我的部分评论。当然应该是“实例.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。请注意(TL;DW:不,它不是实例。\uuuuu class\uuuu
“self”不一定是你。)
class Employee(Person):
def __init__(self):
Person.__init__(self)
self.empnum = 'abc123'
class Employee(Person):
def __init__(self):
Person.__init__(self)
self.empnum = "abc123"
class Person(object):
AnotherName = 'Sue Ann'
def __init__(self):
super(Person, self).__init__()
self.FirstName = 'Tom'
self.LastName = 'Sneed'
def get_name(self):
return self.FirstName + ' ' + self.LastName
class Employee(Person):
def __init__(self):
super(Employee, self).__init__()
self.empnum = 'abc123'
def get_emp(self):
print self.AnotherName
return self.FirstName + ' ' + 'abc'