将方法从一个 class 安全地绑定到 Python 中的另一个 class
Safely bind method from one class to another class in Python
我知道我可以将函数附加到 class 并使其成为方法:
>>> def is_not_bound(inst, name):
... print("Hello %s" % name)
...
>>>
>>> class NoMethods:
... pass
...
>>>
>>> setattr(NoMethods, 'bound', is_not_bound)
>>>
>>> NoMethods().bound("oz") # prints: Hello oz
Hello oz
令我惊讶的是,这也适用于从一个 class 到另一个的绑定方法:
>>> class Foo:
... def foo(self, name):
... print("Hello %s" % name)
...
>>> class B:
... pass
...
>>> setattr(B, 'bound_to_b', getattr(Foo, 'foo'))
>>> B().bound_to_b("confused?")
Hello confused?
>>>
我可以安全地使用它吗?有什么我正在监督的吗?
更新
我已经发现的一个警告:
>>> B.bound_to_b
<function Foo.foo at 0x7fc997e8b730>
尽管我从 B 调用了方法,它似乎绑定到 Foo。
更令人惊讶的是!:
>>> def new_method(self, addto):
... return self.num + addto
...
>>> setattr(B, 'add', new_method)
>>> b=B()
>>> b.num = 2
>>> b.add(2)
4
显然,这是有意为之的行为(这很酷!)。但也显然,这种行为不是很熟悉。
如果你知道 Python 2 很长时间,你可能不会意识到 Python 3 没有方法这一事实(如上所述)。
所以在 Python 3:
>>> class Foo:
... def foo(self, name):
... print("Hello %s" % name)
...
>>> Foo.foo
<function Foo.foo at 0x7f729a406730>
>>> def foo():
... pass
...
>>> foo
<function foo at 0x7f729b83ff28>
>>>
>>> Foo.foo
<function Foo.foo at 0x7f729a406730>
没有区别!然而在 Python 2 中:
Python 2.7.14 (default, Feb 2 2018, 02:17:12)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo:
... def foo(self, name):
... print("Hello %s" % name)
...
>>> Foo.foo
<unbound method Foo.foo>
>>>
我知道我可以将函数附加到 class 并使其成为方法:
>>> def is_not_bound(inst, name):
... print("Hello %s" % name)
...
>>>
>>> class NoMethods:
... pass
...
>>>
>>> setattr(NoMethods, 'bound', is_not_bound)
>>>
>>> NoMethods().bound("oz") # prints: Hello oz
Hello oz
令我惊讶的是,这也适用于从一个 class 到另一个的绑定方法:
>>> class Foo:
... def foo(self, name):
... print("Hello %s" % name)
...
>>> class B:
... pass
...
>>> setattr(B, 'bound_to_b', getattr(Foo, 'foo'))
>>> B().bound_to_b("confused?")
Hello confused?
>>>
我可以安全地使用它吗?有什么我正在监督的吗?
更新
我已经发现的一个警告:
>>> B.bound_to_b
<function Foo.foo at 0x7fc997e8b730>
尽管我从 B 调用了方法,它似乎绑定到 Foo。
更令人惊讶的是!:
>>> def new_method(self, addto):
... return self.num + addto
...
>>> setattr(B, 'add', new_method)
>>> b=B()
>>> b.num = 2
>>> b.add(2)
4
显然,这是有意为之的行为(这很酷!)。但也显然,这种行为不是很熟悉。
如果你知道 Python 2 很长时间,你可能不会意识到 Python 3 没有方法这一事实(如上所述)。
所以在 Python 3:
>>> class Foo:
... def foo(self, name):
... print("Hello %s" % name)
...
>>> Foo.foo
<function Foo.foo at 0x7f729a406730>
>>> def foo():
... pass
...
>>> foo
<function foo at 0x7f729b83ff28>
>>>
>>> Foo.foo
<function Foo.foo at 0x7f729a406730>
没有区别!然而在 Python 2 中:
Python 2.7.14 (default, Feb 2 2018, 02:17:12)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo:
... def foo(self, name):
... print("Hello %s" % name)
...
>>> Foo.foo
<unbound method Foo.foo>
>>>