簡體   English   中英

python 中的方法與類相關聯。 與實例直接關聯的函數意味着什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM