将实例传递给__init__。这是一个好主意吗?

时间:2014-05-28 04:03:20

标签: python class oop instance

假设我有一个这样的简单类:

class Class1(object):
  def __init__(self, property):
    self.property = property
  def method1(self):
    pass

Class1的实例返回一个可以在其他类中使用的值:

class Class2(object):
  def __init__(self, instance_of_class1, other_property):
    self.other_property = other_property
    self.instance_of_class1 = instance_of_class1
  def method1(self):
    # A method that uses self.instance_of_class1.property and self.other_property

这很有效。但是,我觉得这不是一种非常常见的方法,也许有其他选择。说完这个之后,我尝试重构我的类以将更简单的对象传递给Class2,但我发现将整个实例作为参数传递实际上显着简化了代码。为了使用它,我必须这样做:

instance_of_class1 = Class1(property=value)
instance_of_class2 = Class2(instance_of_class1, other_property=other_value)
instance_of_class2.method1()

这与某些R包的外观非常相似。是否有更多的“Pythonic”替代品?

1 个答案:

答案 0 :(得分:3)

这样做并没有错,尽管在这个特定的例子中看起来你可以轻松做到

instance_of_class2 = Class2(instance_of_class1.property, other_property=other_value).

但如果您发现需要在Class1内使用Class2的其他属性/方法,请继续将整个Class1实例传递到Class2。这种方法一直在Python和OOP中使用。许多常见的设计模式要求类获取其他类的实例(或多个实例):代理,外观,适配器等。