首页 > 解决方案 > 类的实例作为同一类的类成员

问题描述

创建作为该类实例的类成员的最“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()

但这似乎有点不对;自然,类成员应该该类中定义。

有一个更好的方法吗?

标签: pythonpython-3.xclass-members

解决方案


这不是“有点错误”——这是一种简单而明显的方法。一行代码,每个人都可以阅读,并且很明显“它是什么”。

它仍然没有“感觉”优雅。因此,如果您不想仅仅为了外观而这样做,也许,如果有很多这样的类,而不是重复代码,可以使用类装饰器来完成:

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__)


推荐阅读