1
我有一个基类A
,以及两个子类从A
继承B
和C
,有在A
一些变量都A
对象之间共享,所以我选择使用类变量,这些类变量应该只初始化一次,我可以通过明确测试并设置A.some_var
在A
中执行此操作。类变量初始化在Python3继承
的示例代码(使用显式的类名):
from queue import Queue
class A:
data_queue = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if A.data_queue is None:
A.data_queue = Queue()
class B(A):
pass
class C(A):
pass
b = B()
c = C()
b.data_queue.put(5)
c.data_queue.get() # Works fine
不过,我不认为这是因为类名是个好主意可以开发过程中被改变。
我也试过type
但在这样的变量都B
对象或C
对象之间共享,因为type(self)
回报B
或C
。
from queue import Queue
class A:
data_queue = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if type(self).data_queue is None:
type(self).data_queue = Queue()
class B(A):
pass
class C(A):
pass
b = B()
c = C()
b.data_queue.put(5)
c.data_queue.get() # Block
那么,有没有更好的方法来初始化类变量A
没有显式类名?
是否有任何理由你不只是用'data_queue = Queue()'而不是'data_queue = None'来初始化类变量? –
@ robert_x44是的,我可以用'data_queue = Queue()'初始化'data_queue',但是我有另一个'Process'需要初始化,它需要'A'的基类的一些上下文信息,如果我选择在类体中初始化它,我仍然必须对类名进行硬编码以访问上下文信息(由于设计原因,我无法在'A'的基类中定义此'Process') – Time1ess
'self .__ class __。data_queue'将工作。可变的类级别状态,或从_instance_构造函数延迟初始化类级别的东西,通常不是一个好主意。在类创建时初始化队列权限(是的,类体中的'data_queue = Queue()'),或者考虑其他共享机制。 – 9000