我试图在类名.AttributeError问题上调用类方法
当我使用@singleton时,我不能使用classname.functionname运行,它必须是classname().functionname,为什么会发生这种情况?
def singleton(cls):
'''
单例
:param cls:
:return:
'''
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
# print(type(_instance[cls])) <class '__main__.Coco'>
return _instance[cls]
return _singleton
@singleton
class Coco():
# def __new__(cls, *args, **kwargs):
# if not hasattr(Coco, "_instance"):
# if not hasattr(Coco, "_instance"):
# Coco._instance = object.__new__(cls)
# print(type(Coco._instance))
# return Coco._instance
def __init__(self):
print('coco')
@classmethod
def get_info(cls):
print('coco is 18 ages old')
# print(Coco().get_info())
print(Coco.get_info())异常
Traceback (most recent call last):
File "/Users/coco/Automation/AutoTestRes/scripts/python/coco.py", line 36, in <module>
print(Coco.get_info())
AttributeError: 'function' object has no attribute 'get_info'发布于 2022-04-11 09:03:41
在Python中使用装饰器时,如下所示:
@decorator_name
class class_name:
....这相当于这样做:
class class_name:
...
class_name = decorator_name(class_name)这意味着变量class_name的值不再一定是类,而是decorator_name的返回值。
在您的示例中,类装饰器singleton返回函数 _singleton,而不是实际的类。所以当你说:
print(Coco.get_info()).这等于说:
print(_singleton.get_info())...within函数。
因此,您将得到一个AttributeError,因为现在名称为Coco的函数没有该属性。
要访问类的属性,需要运行函数,因为这将返回类的一个实例,该实例将具有该属性。
不再可能从全局范围访问类本身。
https://stackoverflow.com/questions/71824973
复制相似问题