Python:创建超级对象的陷阱

时间:2011-06-23 13:33:15

标签: python python-2.7

我们发现在大多数类中都存在一组属性(所有这些属性都不会在运行时从环境中更改)。我试图寻找这个但不幸的是“对象”是一个非常常见的词。

如果我执行以下操作,将导致哪些类型的问题:

class MasterObjectv2(object):
     UNIQUE_KEY = getUniqueKey()
     #other properties for all objects in our system

或者这样更好:

class MasterObject(object):
    def __init__(self):
        object.__init__(self)
        #other properties for all objects in our system
        self.getUniqueKey()

或选项3

# is that its a really dumb idea to do this.

我正在考虑做第一个,因为我不必担心有人不在MasterObject上调用 init

显然我们的班级会改变

class Test(object):
   def __init__(self): 
        self.UNIQUE_KEY = getUniqueKey()

class Test(MasterObject):
    def __init__(self): pass

修改

这些答案不回答我的问题。我不是在问我该怎么做,我问的是如果我们要沿着这条路走下去,会有什么副作用/事情要考虑。

我正在考虑使用环境。*类型类但我首先想知道副作用可能是什么* 如果我沿着另一条路走下去。

我不希望这变成一个构成与继承辩论......;)

4 个答案:

答案 0 :(得分:1)

你真的需要那些作为你实际课程中的属性吗?听起来像将它们保存在一些“配置对象”中,只是从类中访问它是一个更健壮的想法。

对于隐含是-a 关系的情况,优先保留继承,在您的情况下不是真的,AFAIU。

答案 1 :(得分:1)

使用python,您可以轻松控制对象构造以及对象初始化;例如定义

class Master(object):
    def __new__(klass, *args, **kwargs):
        self = object.__new__(klass)
        self.attribute1 = ...
        self.attribute2 = ...
        return self

__new__中的代码在最终在派生类中定义的__init__开始之前执行(因此,如果派生类不调用Master.__init__(self)则无关紧要)。您可以在__new__开始之前使用__init__在实例中设置一些属性。

在您的案例中,这是否合理,主要取决于您未提供的详细信息。

答案 2 :(得分:0)

如果属性是静态的,请使用选项#1。由于属性是类的属性,并且不会从实例更改为实例,因此这似乎是正确的选择。通过选项#1(假设您的类实现类似于Test),您不会引起任何问题。

class MasterObjectv2(object):
     UNIQUE_KEY = getUniqueKey()
     #other properties for all objects in our system

然后您的Test类可以按如下方式实现:

class Test(MasterObject):
    pass

答案 3 :(得分:0)

从环境中获取的属性值是否会对所有这些类都相同?如果是这样,您可能最好只在模块级别保留dict个环境属性。 (或者,正如其他人建议的那样,使用模块来填充和存储环境变量。)

如果没有,我的建议是使用创建一个类方法,在第一次为每个类调用__init__时,用它来填充类中环境变量的字典。