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

17 投票
2 回答
45201 浏览
提问于 2025-04-18 05:17

我正在尝试了解更多关于类和面向对象编程(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 个回答

8

从过渡来看,Python 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()
31

在子类中创建一个自定义的初始化方法,然后通过 super 来调用父类的初始化方法:

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

撰写回答