Python实例化子类

时间:2010-01-07 09:54:08

标签: python

我编写了以下代码,试图弄清楚如何在主类中实例化子类。我想出了一些感觉不对的东西......至少对我而言。

这种类型的实例存在问题吗?有没有更好的方法来调用子类?

class Family():
  def __init__(self):
    self.Father = self.Father(self)
    self.Mother = self.Mother(self)

  class Father():
    def __init__(self, instance = ''):
      self = instance if instance != '' else self
      print self

    def method(self):
      print "Father Method"

    def fatherMethod(self):
      print "Father Method"


  class Mother():
    def __init__(self, instance = ''):
      self = instance if instance != '' else self
      print self

    def method(self):
      print "Mother Method"

    def motherMethod(self):
      print "Mother Method"



if __name__ == "__main__":
  Family = Family()
  Family.Father.method()
  Family.Mother.method()

3 个答案:

答案 0 :(得分:6)

您定义的是(至少在Python术语中)子类 - 它们是内部类或嵌套类。我猜这实际上并不是你想要实现的目标,但我不确定你真正想要的是什么 - 但这是我最好的四个猜测:

  1. A subclass是继承自另一个类的类被称为子类的地方。要使father成为family的子类,请使用语法class Father(Family):。你在这里创建的内容实际上称为内部类,而不是子类。

  2. 当您看到Family.Father.method()之类的内容时,通常意味着“家庭”是module,父亲就是该模块中的一个类。在Python中,module基本上意味着.py file。模块没有__init__方法,但是在导入模块时会执行模块顶层的所有代码(例如if __name__ ...行)。

  3. 同样,您可以将Family设为package - 在Python中,它基本上是指包含__init__.py文件的文件系统上的目录。 FatherMother将成为包

  4. 中的模块或类
  5. 您可能要实现的目标是声明Family类型的对象始终具有Father个对象和Mother个对象。这不需要嵌套类(实际上,嵌套类是一种完全奇怪的方法)。只需使用:

  6. >>> class Mother():
    ...   def whoami(self):
    ...     print "I'm a mother"
    ... 
    >>> class Father():
    ...   def whoami(self):
    ...     print "I'm a father"
    ...
    >>> class Family():
    ...   def __init__(self):
    ...     self.mother = Mother()
    ...     self.father = Father()
    ...  
    >>> f = Family()
    >>> f.father.whoami()
    I'm a father
    >>> f.mother.whoami()
    I'm a mother
    >>> 
    

答案 1 :(得分:1)

你是对的,这段代码感觉是对的。我的问题是......

  • 你想要达到什么目的?无需在Father内定义MotherFamily,可以在Family之外定义它们并将其汇总到其中。 (事实是,FatherMother不应该在Family之外访问吗?Python没有可见性修饰符,例如因为原则是:'我们都成长了-up here',意思是开发人员应该负责并承担负责任的代码处理......)

  • 你真的需要像Class.Class.method这样的东西吗?除了这个事实,方法查找有点贵,这些链可能表示错误的轴,这意味着你试图从一个设计不太明确的点抓住功能(抱歉是这里模糊不清。)

答案 2 :(得分:1)

Blergh。

为什么父亲和母亲在家庭下面嵌套?没有理由这样做。在外面定义它们,然后在里面实例化它们。

我不确定你想要做什么。您可能需要查看Descriptors,这是一种在clss中定义子对象的方法。