Python中MemoryClass类__init__与__call__参数的类型关联疑问
Python参数命名与内置名称的疑问解答
疑问1:将__init__的参数命名为function的情况
Python里的参数名只是普通标识符,和内置名称同名时,只会在当前方法的作用域内覆盖原有的内置名称,但不会强制限制传入参数的类型。
换句话说,名为function的参数可以接收任意类型的对象——整数、字符串、函数、自定义类实例等等都可以,Python不会自动把它关联成函数类型。
举个实际代码例子:
class MemoryClass: def __init__(self, function): self.function = function # 传入整数 obj1 = MemoryClass(123) # 传入字符串 obj2 = MemoryClass("test") # 传入函数对象 def demo_func(): pass obj3 = MemoryClass(demo_func)
以上代码完全可以正常运行,没有任何类型强制限制。
疑问2:将__call__的参数命名为list的情况
逻辑和上面完全一致:list作为参数名只是一个标识符,即便它和Python内置的列表类型同名,也不会强制要求传入的参数必须是list类型,你可以传入任意对象。
代码示例:
class MemoryClass: def __call__(self, list): print(f"传入对象的类型:{type(list)}") obj = MemoryClass() obj(789) # 输出:传入对象的类型:<class 'int'> obj({"name": "jumi"}) # 输出:传入对象的类型:<class 'dict'> obj([1,2,3]) # 输出:传入对象的类型:<class 'list'>
额外提醒
虽然Python允许用内置名称作为参数名,但不推荐这么做——因为这会在当前方法作用域内覆盖原有的内置对象,导致你无法直接使用原内置功能。比如在上面的__call__方法里,你再想创建一个新列表,就不能直接写list()了,得改用__builtins__.list(),反而增加了代码复杂度。
内容的提问来源于stack exchange,提问作者jumi
相关产品推荐
相关产品推荐

