数据属性和方法属性之间的差异

Lea*_*pez 16 python methods attributes

什么是方法属性和数据属性?它们和它们有什么共同之处有什么区别?

我正在阅读python 2.7.9(https://docs.python.org/2/tutorial/classes.html#random-remarks),突然之间变得难以理解.我会对它有所了解.

Blc*_*ght 22

属性是使用点语法在另一个对象上查找的变量:obj.attribute.Python的设计方式,属性查找可以做各种各样的事情,如果你不真正理解发生了什么,这种变化有时会导致错误(这是你链接的文档所警告的).

最基本的问题是属性查找可以找到存储在对象实例字典中的值,或者它可以从对象的类(或基类,如果继承继续)中找到某些东西.方法是存储在类中的函数,但是通常通过在实例上查找它们来使用它们("绑定"方法,在调用方法时将对象作为第一个方法插入).

检查的确切顺序有点复杂(我在回答另一个问题时描述了完整的过程),但在最基本的层面上,实例属性通常优先于类属性.

如果存在实例属性和具有相同名称的类属性,则通常只能访问实例属性.如果它是无意的,这可能会非常混乱.

请考虑以下代码:

class Foo(object):
    def __init__(self, lst):
        self.lst = lst

    def sum(self):
        self.sum = sum(self.lst)
        return self.sum

f = Foo([1,2,3])

print(f.sum())
print(f.sum())
Run Code Online (Sandbox Code Playgroud)

在此代码的底部,我们进行两次相同的调用.第一个工作正常,但第二个会引发异常.

这是因为我们第一次查找时f.sumFoo类中找到了一个方法.我们可以毫无问题地调用该方法.问题来自于该sum方法将其计算结果(元素的总和self.lst)分配给也命名的实例属性sum.这隐藏了sum方法.

当第二次f.sum()调用查找时f.sum,它会找到包含整数的实例属性6,而不是预期的方法.整数不可调用,因此我们得到一个例外.

当然,解决方案不是为方法和属性使用相同的名称.上面的代码是一个非常简单的例子.在更复杂的代码中由此类事物引起的错误可能更难以弄清楚.

如果您正在编写将属性添加到您不太了解的对象的代码,那么您应该小心避免使用常用名称.如果您正在编写mixin类,请考虑在属性名称中使用两个前导下划线来触发Python的名称修改,这是针对这种情况而设计的.

  • 你的解释非常简单.因此,在我看来,我链接的文档想要'data attribute'='instance attribute','method attribute'='class attribute'.如果我错了请纠正我. (2认同)
  • 恩,那就对了.我认为文档可能相当陈旧,并不完全是最新的.当然,"实例属性"和"类属性"现在是更常见的术语.值得注意的是,真实情况比我在这里介绍的要复杂一些.某些类属性(例如`property`对象)将优先于实例属性.然而,你不太可能错误地结束这种情况. (2认同)

Mal*_*imi 9

属性是缺少绑定到对象的更好单词的任何东西,例如:

class Dog:
    def __init__(self):
        self.name = "Rufus"

    def bark(self):
        print "Woof Woof!"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,data属性是名称,它只是绑定到Dog实例的值.至于方法属性,一个答案是树皮方法,因为它不是一个值,而是一个动作.就像英文一样.数据属性与听起来完全一样; 它的数据,它只是一个属性.方法是一个过程,一个动作,这正是方法属性.