ely*_*ely 16 python methods types function dynamic
用相同的两个功能为什么id值有像不同的属性__doc__或__name__?
这是一个玩具示例:
some_dict = {}
for i in range(2):
def fun(self, *args):
print i
fun.__doc__ = "I am function {}".format(i)
fun.__name__ = "function_{}".format(i)
some_dict["function_{}".format(i)] = fun
my_type = type("my_type", (object,), some_dict)
m = my_type()
print id(m.function_0)
print id(m.function_1)
print m.function_0.__doc__
print m.function_1.__doc__
print m.function_0.__name__
print m.function_1.__name__
print m.function_0()
print m.function_1()
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
57386560
57386560
I am function 0
I am function 1
function_0
function_1
1 # <--- Why is it bound to the most recent value of that variable?
1
Run Code Online (Sandbox Code Playgroud)
我已经尝试混合调用copy.deepcopy(不确定函数是否需要递归副本或者它是否过度杀伤)但这并没有改变任何东西.
Mar*_*ers 18
您正在比较方法,并且每次访问实例或类(通过描述符协议)时,方法对象都会重新创建.
一旦你测试了它们,id()你就会再次丢弃这个方法(没有引用它),所以Python在你创建另一个方法时可以自由地重用id.您想通过使用m.function_0.__func__和测试这里的实际功能m.function_1.__func__:
>>> id(m.function_0.__func__)
4321897240
>>> id(m.function_1.__func__)
4321906032
Run Code Online (Sandbox Code Playgroud)
方法对象从它们包装的函数继承__doc__和__name__属性.实际的底层函数实际上仍然是不同的对象.
至于返回的两个函数1; 这两个函数都i用作闭包; 调用方法i时会查找值,而不是在创建函数时查找.请参阅Python嵌套函数中的局部变量.
最简单的解决方法是使用工厂函数添加另一个范围:
some_dict = {}
for i in range(2):
def create_fun(i):
def fun(self, *args):
print i
fun.__doc__ = "I am function {}".format(i)
fun.__name__ = "function_{}".format(i)
return fun
some_dict["function_{}".format(i)] = create_fun(i)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |