gpt4 book ai didi

python - 在 Python 中将类名分配给类变量

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:39 25 4
gpt4 key购买 nike

在Python 3.5中,如何将类名赋给类变量?明显的替代方法是对类名进行硬编码。

class Foo(object):
the_module = __name__
also_the_module = __module__

def name_of_module(self):
return __name__
def name_of_class(self):
return __class__.__name__

print("Foo.the_module= ", Foo.the_module)
print("Foo.also_the_module= ", Foo.also_the_module)
print("Foo.__name__= ", Foo.__name__) # what is desired but outside of class def
print("Foo().name_of_module=", Foo().name_of_module())
print("Foo().name_of_class= ", Foo().name_of_class()) # what is desired but inside a method

我尝试从 @classmethod 的第一个参数获取类。

class Foo(object):
@classmethod
def class_name(cls):
return cls.__name__

# Both of these produce the correct response but neither
# can be used assign to a class variable
print("Foo.class_name()= ", Foo.class_name())
print("Foo().class_name()= ", Foo().class_name())

不幸的是,在分配给类变量时无法调用该函数。 class = class_name 产生 NameError: name 'class_name' is not Definedmy_class = Foo.class_name() 产生 NameError: name 'Foo' is not Defined

注意:更新了问题以使用正确的 Python 术语“类变量”而不是静态变量(反射(reflect)我的 C++ 背景)

最佳答案

注意有类方法

@classmethod
def class_name(cls):
return cls.__name__

与直接调用 x.__class__.__name__ 相比,没有任何作用。

如果要指定类名,只需修改类本身即可:

class Foo(object):
@classmethod
def class_name(cls):
return cls.__name__

Foo.__name__ = "bar"
a = Foo()
print(a.class_name())

输出

如果您只想为一个实例使用不同的类名称,则需要动态创建一个新类(继承旧类)并更改该类的名称。

def set_class_name(instance, new_class_name):
orig_class = instance.__class__

class _new_class(orig_class):
pass

_new_class.__name__ = new_class_name
a.__class__ = _new_class

a = Foo()
set_class_name(a, 'bar')
print(a.class_name())

也输出bar

关于python - 在 Python 中将类名分配给类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35634300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com