Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类继承问题_Python_Class_Inheritance - Fatal编程技术网

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中那样自

我在玩Python类继承时遇到了一个问题,即如果从子类(下面的代码)调用继承的
\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'