我们发现在大多数类中都存在一组属性(所有这些属性都不会在运行时从环境中更改)。我试图寻找这个但不幸的是“对象”是一个非常常见的词。
如果我执行以下操作,将导致哪些类型的问题:
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
修改
这些答案不回答我的问题。我不是在问我该怎么做,我问的是如果我们要沿着这条路走下去,会有什么副作用/事情要考虑。
我正在考虑使用环境。*类型类但我首先想知道副作用可能是什么* 如果我沿着另一条路走下去。
我不希望这变成一个构成与继承辩论......;)
答案 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__
时,用它来填充类中环境变量的字典。