python - 类的实例作为同一类的类成员
问题描述
创建作为该类实例的类成员的最“pythonic”方式是什么?即是这样的:
class MyClass:
# error! (and this is to be expected as MyClass is not yet fully defined)
instance_as_member = MyClass()
def __init__(self):
print("MyClass instance created!")
可以通过在类定义后添加一个成员来解决这个问题:
class MyClass:
...
MyClass.instance_as_member = MyClass()
但这似乎有点不对;自然,类成员应该在该类中定义。
有一个更好的方法吗?
解决方案
这不是“有点错误”——这是一种简单而明显的方法。一行代码,每个人都可以阅读,并且很明显“它是什么”。
它仍然没有“感觉”优雅。因此,如果您不想仅仅为了外观而这样做,也许,如果有很多这样的类,而不是重复代码,可以使用类装饰器来完成:
def instance_as_member(attr_name='instance_as_member', *init_args, **init_kwargs):
def decorator(cls):
instance = cls(*init_args, **init_kwargs)
setattr(cls, attr_name, instance)
return cls
return decorator
@instance_as_member()
class MyClass:
...
装饰器对此没问题,因为它们在完全创建 cls 后将其作为参数进行修改。对于元类,这会很棘手,因为类实例化的某些步骤,例如调用__init_subclass__
是在__init__
任何可以被覆盖的显式元类方法之后执行的,因此,尝试在元类初始化方法( 、、__new__
或元类)中创建实例可能会遇到问题。元类' __call__
)
推荐阅读
- javascript - 如何通过反应上下文api传递多个状态
- javascript - 数据更新时Vue Chart JS重新渲染图表
- django - 如何从模型函数中获取数据以显示在 Django Admin 中?
- java - 是否可以使用 Log4J 之类的参数编译 Java 字符串?
- vue.js - Nuxt 当 asyncData 调用不返回数据时,立即显示错误
- c++11 - 为什么行为会随着 emplace_back / push_back 顺序的变化而变化?为什么构造函数的数量增加了?
- flutter - Flutter 方法在完成之前跳转
- angular - 如何测试角度分量
- javascript - 通过ajax获取值
- java - 如何在编译时访问嵌套依赖项?