python - 自己类中的类属性
问题描述
我想有一个类实例作为它自己的类中的类属性。它是组织该类的一组固定实例。我想我前段时间在 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
type
推荐阅读
- asp.net-core - “功能文件夹/切片”Aspnet Core 中的 Javascript 文件
- android - 创建帐户后 Flutter 和 Firebase 自动登录
- python - cx_Oracle 连接速度慢
- typescript - NestJS 将 HTTP 重定向到 HTTPS / 强制 SSL
- ads - Branch.io 使用参数查询从点击 URL 中删除重定向
- python - 如何将一个示例文本输入提供给预训练的 LSTM 模型
- shell - 使用大括号从字母与速度中转义变量
- python-3.x - 获取与列对应的值列表第一次出现的行索引
- javascript - 在延迟加载的模块上重新加载后,Angular 8 从错误的路径加载 javascript
- batch-file - 为什么要删除每个文本文件而不是昨天的日期