簡體   English   中英

為什么我們更喜歡使用self.method()而不是Class.method(self)

[英]Why do we prefer to use self.method() instead of Class.method(self)

例如,對於某些類:

class Class(object):
    def __init__(self):
        pass

    def something(self):    # yes I know this could be static
        print("something")

和實例

instance = Class()

以下都是技術上有效的:

instance.something()       # normal
Class.something(instance)  # but also technically valid

是否有一些明確的推理為什么第一個用例是首選? 我可以想到迭代實例和調用方法等示例,但我也可以想到一些情況,當我明確引用我正在使用的類時,可能更容易解釋我的代碼。

如果之前已經回答過,請道歉。 我找不到它,這可能是由於我在措辭問題上的困難。

Class.something(instance)特定類中獲取方法。 self.something()使用該實例的類,並且不一定是同一個類

如果你必須繼續使用類名,你也會重復很多。

您的標題使用self ,表示方法中的代碼。 比較以下示例的輸出:

class Animal:
    def make_sound(self):
        print('General nature sounds')

    def startle(self):
        self.make_sound()

    def pet(self):
        Animal.make_sound(self)

class Dog(Animal):
    def make_sound(self):
        # overrides Animal.make_sound()
        print('Bark!')

dog = Dog()
dog.startle()  # prints "Bark!"
dog.pet()      # prints "General nature sounds"

Animal.make_sound(self)有效,但會使用原始方法,忽略Dog.make_sound()的新實現。

對於您在其他地方引用實例的情況,請考慮接受類或子類的情況

class Cat(Animal):
    def make_sound(self):
        print('Meouw!')

def groom_pet(pet):
    pet.startle()
    Animal.make_sound(pet)

groom_pet(Cat())  # prints "Meouw", then "General nature sounds"

所以我們有一個新的Animal子類,而groom_pet()可以接受任何Animal實例,因為子類也有相同的方法。 但是pet.startle()將最終調用正確的make_sound()實現,而Animal.make_sound()將再次繞過正確的實現。

很少應該在實例上使用綁定方法的未綁定類方法。 有時候有理由使用它; 特別是如果你想繞過父類方法(所以不使用super().method() ),或者你想提高性能並避免查找屬性並在緊密循環中綁定方法。

因為這種情況很少而且很特殊,所以你想要堅持正常的習慣用法 ,因為這有助於你自己和其他讀者理解你的代碼。 不要讓那些讀者感到驚訝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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