Python类继承:如何使用不在父类中的值初始化子类

时间:2014-05-04 03:19:17

标签: python class python-2.7 inheritance

我试图了解有关课程和OOP的更多信息。

如何让我的Person类初始化Entity的所有值,但也可以使用Entity类中可能不包含的值?

例如,PersonSpirit都继承自Entity。但是,只有Person会有gender。如何Person初始化gender

之后,我是否仍然可以创建Person的实例并以与我在下面相同的方式致电describe()

class Entity(object):

    def __init__(self, state, name, age):
        self.state = state
        self.name = name
        self.age = age

class Person(Entity):

    def describe(self):
        print "Identification: %s, %s, %s." % (self.state, self.name, self.age)

class Spirit(Entity):
    pass  # for now

steve = Person("human", "Steve", "23" # can I then list gender here?)
steve.describe()

2 个答案:

答案 0 :(得分:9)

在子类上创建自定义初始值设定项,然后通过super调用父类的初始值设定项:

class Person(Entity):
    def __init__(self, state, name, age, gender):
        self.gender = gender
        super(Person, self).__init__(state, name, age)

答案 1 :(得分:1)

在过渡上,看起来Py 3.x版本(不确定哪个版本)允许使用super()的简洁版本:

def __init__(self, state, name, age, gender):
        self.gender = gender
        # Prototype initialization 3.x:
        super().__init__(state, name, age)

曾经使用数据类尝试SQLAlchemy模型,所以当我查看Python继承的所有内容时,我觉得这可能会扩展答案:

from dataclasses import dataclass

@dataclass
class Entity():
    state: str
    name: str
    age: int

@dataclass
class Person(Entity):
    gender: str

    def describe(self):
        print("State: {state}, Name: {name}, Age: {age}, Gender: {gender}"
            .format(state=self.state, name=self.name, age=self.age, gender=self.gender))

man = Person("human", "humanname", 21, "cisgendered")

man.describe()