本帖最后由 阿奇_o 于 2021-7-13 16:08 编辑
准确来说,__name__ 应该不仅仅包括 “模块名”或“类名”,而是 包括
definition.__name__
The name of the class, function, method, descriptor, or generator instance. 导入时,才是指“模块名”,
__name__
The __name__ attribute must be set to the fully-qualified name of the module. This name is used to uniquely identify the module in the import system.
换言之,可以看做是 当前命名空间的唯一标识符(独一无二的一个名字),使用 globals() 查看,就明白了:>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'log': <function log at 0x0000026960AD19D8>, 'test1': <function log.<locals>.wrapper at 0x0000026960ADF9D8>, 'test2': <function test2 at 0x0000026960B27DC8>}
可以看到,被@log修饰的test1函数,指向的是 (作为) 函数log的一个局部变量 : log.<locals>.wrapper
当你用 print(test1.__name__) 时,它 只打印了 wrapper 这个变量名。
(又或者说,这里print其实是 调用用了 log.<locals>.wrapper.__str__() 其返回的字符串,刚好是 wrapper。 若是自定义的类,你其实可以重写__str__,就可以返回任何字符串...)
>>> class MyClass():
def __str__(self):
return '我叫MyClass'
>>> obj = MyClass()
>>> print(obj)
我叫MyClass
>>> obj.__str__()
'我叫MyClass'
>>>
OK,应该可以明白了。。
至于 参数个数的问题,是python的语法特性,* 代表若干个(0-N个参数,皆可)具体Twilight大佬已经解释了。
|