[英]Methods in python are associated with the class. what does a function associated directly with the instance imply?
我知道在 python 中,方法與類而不是實例相關聯,但它們接受實例作為他們的第一個參數以便訪問它。 但是,仍然可以定義一個函數並將其直接綁定到一個實例。 這意味着什么? 這個函數可以以某種方式訪問實例嗎?
class TestClass:
def __init__(self, a):
self.a = a
def method1(self):
return self.a
my_obj = TestClass(12)
print(my_obj.method1()) // 12
Python 也允許這樣做:
class TestClass:
def __init__(self, a):
self.a = a
my_obj = TestClass(12)
def method1_defined_outside(self):
return self.a
TestClass.method1 = method1_defined_outside
print(my_obj.method1()) // 12
上面兩個片段的意思是一樣的。 但是 python 也允許這樣做:
class TestCase:
def __init__(self, a):
self.a = a
my_obj = TestCase(12)
def method1_defined_outside(self):
return self.a
my_obj.method1 = method1_defined_outside
print(my_obj.method1()) // this throws an error stating the method1 is missing one postional argument(s), so clearly self does not automatically equate to the object
第二個和第三個片段之間的區別在於,外部定義的方法與后者的實例相關,而前者與類相關。
當您通過實例訪問方法,但該方法存在於類中時,訪問該方法實際上會創建一個方法包裝器。 這個包裝器知道調用該方法的實例,並將它作為第一個參數傳遞給實際函數(按照約定命名為self
)。 這背后的機制是描述符協議,它也是屬性的工作方式。
當您將方法直接放在實例上時,這些都不適用,它只是您通過實例訪問的一個函數。 它不會得到self
。
現在,您可以通過手動調用描述符來創建方法包裝器,並在實例上設置生成的綁定方法。
my_obj.method1 = method1_defined_outside.__get__(my_obj)
現在my_obj.method1()
將my_obj
作為self
傳遞。
但是,您希望在這樣的實例上設置方法的情況相當罕見。
您可以強制將實例作為self
發送的一種方法是使用functools.partial
包裝器作為:
from functools import partial
class A:
def __init__(self):
self.x = 10
a1 = A()
def do_external(self):
print("EXTERNAL", self.x)
a1.doext = partial(do_external, a1)
a1.doext()
這將在控制台中產生:
EXTERNAL 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.