我想有一个类实例作为它自己的类中的类属性。它是组织该类的一组固定实例。我想我前段时间已经在 Java 中做到了这一点。
打电话
c = A()
课外工作完美。
最小代码示例:
class A:
c = A()
def __init__(self):
self.B = 1
def doSomething(self):
print(self.B)
但是总是有一个错误:NameError: name 'A' is not defined
----> 2 c = A()
NameError: name 'A' is not defined
是否可以将“c”作为 A 类的实例?然后我会用:
A.c.doSomething()
等等。当然在真正的代码中有更多的例子,比如'c'。
这是可能的,但您必须先定义类,然后才能实例化它。
class A:
def __init__(self):
self.B = 1
def doSomething(self):
print(self.B)
A.c = A()
一个class
语句提供了更声明的方式比调用创建类type
明确。以上等价于
def A_init(self):
self.B = 1
def A_doSomething(self):
print(self.B)
A = type("A", (), {'__init__': A_init, 'doSomething': A_doSomething})
del A_init, A_doSomething
type
必须先完成对 的调用,然后才能将 的实例添加A
到dict
作为第三个参数传递给 的type
。
您可能会发现装饰器使类属性的添加更加“原子”:
def add_instances(*names):
def _(cls):
for name in names:
setattr(cls, name, cls())
return cls
return _
@add_instances("c", "d", "e")
class A:
def __init__(self):
self.B = 1
def doSomething(self):
print(self.B)
将导致A.c
, A.d
, 和A.e
all 指的是 的不同实例A
。请注意,add_instances
除了假设它可以在没有任何参数的情况下实例化之外,不会对其应用的类做出任何假设。
如果您想知道为什么可以通过引用您当前定义的函数来编写递归函数:
def factorial(n):
return 1 if n == 0 else n*factorial(n-1)
不同之处在于def
语句的主体只在语句本身被评估时被解析,而不是def
被评估。class
语句的主体被逐个语句评估,以生成dict
传递给 的 a type
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句