python - 如何使用类方法初始化类成员

标签 python oop class-method

我有一个类,它包含一些成员 x(例如,所有实例都需要但独立于它们的一些数据):

class Foo(object):
    x = 23

    # some more code goes here    

现在,确定 x 的过程变得更加复杂,而且我希望能够在特定时间“刷新”x,所以我决定编写一个额外的函数为之

class Foo(object):
    @classmethod
    def generate_x(cls):
        cls.x = 23

    # some more code goes here

但是,此类定义缺少 generate_x 的初始化调用。

到目前为止我尝试了什么:

这不起作用:

class Foo(object):

    # generate_x()     # NameError: name 'generate_x' is not defined
    # Foo.generate_x() # NameError: name 'Foo' is not defined

    @classmethod
    def generate_x(cls):
        cls.x = 23

这可行但不太清楚,因为代码是在类定义之外使用的

class Foo(object):

    @classmethod
    def generate_x(cls):
        cls.x = 23

    # ...
Foo.generate_x()

有更好的替代方案吗?使用 @classmethod 是最好的方法吗?我正在搜索的是 __init__ 的等效类。

考虑到代码的清晰度,有没有比后者更好的方法来使用函数自动实例化Foo.x

最佳答案

实现此目的的一种方法是使用装饰器:

def with_x(cls):
   cls.generate_x()
   return cls

@with_x
class Foo(object):
   @classmethod
   def generate_x(cls):
      cls.x = 23

(也就是说,我个人会在类声明之后显式调用 Foo.generate_x,并完全避免所有魔法。)

关于python - 如何使用类方法初始化类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45567075/

相关文章:

ruby - 继承中类方法的 self 与类名

ios - Swift 在协议(protocol)中声明类函数

python - Jupyter突然挂了怎么办?

python - 如何正确打破这个循环

python - 在python中创建2个素数的乘积时出现问题

python - @staticmethod 和@classmethod 如何作用于python 中的变量?

javascript - 将变量从 IPython/Jupyter 内核提取到 javascript

c++ - 具有不同数据类型的纯虚拟方法

java - 泛型继承有什么问题

c++ - 使用 cout 后对象数组被破坏