考虑:
class Parent():
def __init__(self, last_name, eye_color):
self.last_name = last_name
self.eye_color = eye_color
def show_info(self):
print("Last Name - "+self.last_name)
print("Eye Color - "+self.eye_color)
billy_cyrus = Parent("Cyrus", "blue")
以上内容来自于UdacityPython课程。我发现我可以使用以下任一方法调用show_info
,例如billy_cyrus
:
我很好奇为什么。这两种方法有区别吗?如果是这样的话,什么时候使用一个呢?如果重要的话,我会使用python3.6。在
就调用方法而言,大多数情况下都没有区别。就底层机器的工作原理而言,有点不同。在
因为} 为该实例创建一个绑定方法。绑定方法基本上是一个闭包,它在您提供的任何其他参数之前为您传递
show_info
是一个method,所以它在类中是descriptor。这意味着,当您通过一个没有被另一个attribute隐藏的instance访问它时,.
运算符调用描述符上的^{self
参数。您可以看到绑定是这样发生的:每次在类方法上使用
.
运算符时,都会创建一个不同的闭包。在另一方面,如果通过类对象访问方法,则它不会被绑定。方法是一个描述符,它只是类的常规属性:
^{pr2}$您可以通过自己调用方法的
__get__
来模拟在调用方法之前绑定它的确切行为:同样,在99.99%的情况下,这不会对您产生任何影响,因为在功能上}最终使用相同的参数调用相同的底层函数对象。在
bound_meth()
和{重要的地方
在很多地方,如何调用类方法很重要。一个常见的用例是重写方法,但希望使用父类中提供的定义。例如,假设我有一个类,我通过重写^{} 使其成为“不可变的”。我仍然可以在实例上设置属性,如下所示的
__init__
方法:如果我试图通过做}来获得非常相似的效果。在
self.a = a
对__init__
中的__setattr__
进行普通调用,则每次都会引发一个ValueError
。但是通过使用object.__setattr__
,我可以绕过这个限制。或者,我可以做super().__setattr__('a', a)
获得相同的效果,或者{@Silvio Mayolo的回答有另一个很好的例子,在这个例子中,您可能会有意将类方法用作一个可以应用于许多对象的函数。在
另一个重要的地方(尽管不是在调用方法方面),是当您使用其他常用描述符时,比如^{} 。与方法不同,属性是data-descriptors。这意味着除了
__get__
之外,它们还定义了一个__set__
方法(以及可选的__delete__
)。属性创建一个虚拟属性,其getter和setter是任意复杂的函数,而不仅仅是简单的赋值。要正确使用属性,您必须通过实例来完成。例如:现在你可以做一些类似
如果尝试通过类访问属性,则可以获取底层描述符对象,因为它将是未绑定的属性:
另一方面,隐藏与}中的条目,即使实例
__dict__
中属性同名的属性是一个很好的技巧,因为类__dict__
中的数据描述符胜过实例{__dict__
条目胜过类中的非数据描述符。在哪里会变得奇怪
可以用Python中的实例方法重写类方法。这意味着}根本不调用相同的底层函数。这与magic methods无关,因为它们总是使用前一个调用,但是对于普通的方法调用来说,这会有很大的不同。在
type(foo).bar(foo)
和{有几种方法可以override a method on an instance。我发现最直观的方法是将instance属性设置为绑定方法。下面是一个修改后的
billy_cyrus
的示例,假设在原始问题中Parent
的定义:在这种情况下,调用实例与类的方法会得到完全不同的结果。这仅仅是因为方法是非数据描述符。如果它们是数据描述符(使用
__set__
方法),赋值billy_cyrus.show_info = alt_show_info.__get__(billy_cyrus, Parent)
不会覆盖任何内容,而是重定向到__set__
,并在b中手动设置billy_cyrus
的__dict__
将被忽略,就像属性一样。在其他资源
以下是一些关于描述符的资源:
两者在语义上没有区别。这完全是风格问题。您通常会在正常使用中使用
billy_cyrus.show_info()
,但是允许使用第二种方法的事实允许您使用Parent.show_info
将方法本身作为一级对象。如果这是不允许的,那么就不可能(或者至少,相当困难)做这样的事情。在相关问题 更多 >
编程相关推荐