【问题标题】:Python Class Inheritance: How to initialize a subclass with values not in the parent classPython 类继承:如何使用不在父类中的值初始化子类
【发布时间】:2014-06-20 13:26:21
【问题描述】:

我正在尝试了解有关类和 OOP 的更多信息。

如何使用Entity 的所有值以及Entity 类中可能不包含的值来初始化我的Person 类?

例如,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()

【问题讨论】:

    标签: python class python-2.7 inheritance


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      从过渡上看,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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        相关资源
        最近更新 更多