每当我定义一个其实例创建其他类的对象的类时,我喜欢将那些其他对象的类型定义为类成员:
class Foo(object):
DICT_TYPE = dict # just a trivial example
def __init__(self):
self.mydict = self.DICT_TYPE()
class Bar(Foo):
DICT_TYPE = OrderedDict # no need to override __init__ now
这个想法是允许潜在的子类轻松覆盖它。
我刚刚发现这个习惯有问题,当我使用的“类型”不是真正的类型,而是工厂函数时。例如,RLock
令人困惑的是不是一个类:
def RLock(*args, **kwargs):
return _RLock(*args, **kwargs)
因此以同样的方式使用它是不好的:
class Foo(object):
LOCK_TYPE = threading.RLock # alas, RLock() is a function...
def __init__(self):
self.lock = self.LOCK_TYPE()
这里的问题是,因为RLock
是一个函数,所以self.LOCK_TYPE
绑定到self
,导致绑定方法,从而导致错误。
以下是使用函数而不是类时出现问题的快速演示(对于比RLock
上面更简单的情况):
def dict_factory():
return {}
class Foo(object):
DICT_TYPE1 = dict
DICT_TYPE2 = dict_factory
f = Foo()
f.DICT_TYPE1()
=> {}
f.DICT_TYPE2()
=> TypeError: dict_factory() takes no arguments (1 given)
有人对这个问题有很好的解决方案吗?我定义这些班级成员的习惯从根本上是错误的吗?
我想我可以用工厂方法替换它。那会是更好的方法吗?
class Foo(object);
def __init__(self):
self.lock = self._make_lock()
def _make_lock(self):
return threading.RLock()