例如,对于某些类:
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
是否有一些明确的推理为什么首选用例?我可以想到迭代实例和调用方法等示例,但我也可以想到一些情况,当我明确引用我正在使用的类时,可以更容易地解释我的代码。
如果之前已经回答过,请道歉。我找不到它,这可能是由于我在处理这个问题时遇到了困难。
答案 0 :(得分:7)
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()
),或者你想提高性能并避免查找属性并在紧密循环中绑定方法。
因为这种情况很少而且很特殊,所以你想要坚持正常的习惯用法,因为这有助于你自己和其他读者理解你的代码。不要让那些读者感到惊讶。