我有以下类和类变量:
class MyClass:
class_var_1 = "a"
class_var_2 = run_class_method()
@classmethod
def run_class_method(cls):
return "ran class method"
然而,翻译说run_class_method
没有定义。使用MyClass.run_class_method()
也不行。来自java背景,我不明白为什么这不起作用。那么,我该如何修复它呢?
此外,我发现如果我在类末尾定义类变量,这会起作用。这在Python中被认为是不好的做法吗?
python中的类体是一个可执行上下文,不像Java中只包含声明。这最终意味着执行顺序在类定义中很重要。
引用文档:
类定义是一个可执行语句。
...
然后,使用新创建的本地命名空间和原始全局命名空间在新的执行框架中执行该类的套件(请参阅命名和绑定)。 (通常,套件主要包含函数定义。)当类的套件完成执行时,其执行帧将被丢弃,但其本地命名空间将被保存。 [4] 然后使用基类的继承列表和属性字典保存的本地命名空间创建类对象。类名绑定到原始本地命名空间中的该类对象。
多一点较长的解释 https://medium.com/@makmanalp/python-statements-in-the-body-of-a-class-63664392e062.
如果要调用函数来定义类变量,可以使用以下方法之一来完成:
-
使用静态方法:
class MyClass:
def _run_instance_method():
return "ran instance method"
run_instance_method = staticmethod(_run_instance_method)
class_var_1 = "a"
class_var_2 = _run_instance_method() # or run_instance_method.__func__()
-
或将其定义为独立函数:
def run_method():
return "ran method"
class MyClass:
class_var_1 = "a"
class_var_2 = run_method()
# optional
run_method = staticmethod(run_method)
-
或访问原始函数__func__
并提供一个假人cls
value:
class MyClass:
@classmethod
def run_class_method(cls):
return "ran class method"
class_var_1 = "a"
class_var_2 = run_class_method.__func__(object())
-
或者在类创建后设置类变量:
class MyClass:
@classmethod
def run_class_method(cls):
return "ran class method"
class_var_1 = "a"
MyClass.class_var_2 = MyClass.run_class_method()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)