【问题标题】:Python 3.x OOP, Inheritance after an object has already been definedPython 3.x OOP,已定义对象后的继承
【发布时间】:2018-08-06 14:42:50
【问题描述】:

这是代码。

class Animal(object):
  def __init__(self):
    self.alive = "alive"
    self.good = "good"
    self.eyecolor = "varys"


sally = Animal()

sally.eyecolor = "brown"


class Canine(Animal):
    def __init__(self):
     super(Canine,self).__init__()
     self.legs = 4
     self.fur = "everywhere"
 sally = Canine()
 print(sally.eyecolor)

所以在这个场景中,我有一个类和一个由它构造的对象,sally。现在我有一个新班级,Canine,我想将 sally 搬到其中。有什么办法可以让莎莉进入 Canine 班级,让她保持原来的眼睛颜色?

  • 我知道我可以再次执行 sally.eyecolor = "brown",但是,在真正的问题中,我有更多属性,并且为每个属性都这样做很麻烦。

  • 我在考虑 copy.deepcopy(sally),但我不确定如何让她通过类实例来继承新类。

【问题讨论】:

    标签: python-3.x oop inheritance


    【解决方案1】:

    您必须定义一个允许这样做的类方法,例如Canine.from_animal

    您可能正在考虑这样做,因为从一种类型转换为另一种类型是常见的事情。例如,您过去可能这样做过。

    x = float(1) # 1.0
    

    那你为什么不能这样做呢?

    canine = Canine(some_animal)
    

    答案是 Python 不只是推断如何将一个类转换为另一个类,即使它是子类也是如此。这种行为必须通过某种方法来定义。

    例如,如果要将类对象强制转换为 float,则必须定义 __float__ 特殊方法。

    由此得出的自然结论是,您需要实现自己的类方法才能从 Animal 类型的对象中获取 Canine 类型的对象。

    class Canine(Animal):
    
        ...
    
        @classmethod
        def from_animal(cls, animal):
            canine = cls()
            canine.eyecolor = animal.eyecolor
    
            # Implement any additional logic here
    
            return canine
    
    sally = Animal()
    
    sally.eyecolor = "brown"
    
    sally = Canine.from_animal(sally) # Sally knows where she stands now
    

    请注意,没有什么可以阻止您在 Animal 类中定义方法 to_canine

    class Animal(object):
    
        ...
    
        def to_canine(self):
            canine = Canine()
            canine.eyecolor = self.eyecolor
            return canine
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2015-01-20
      • 2023-03-25
      相关资源
      最近更新 更多