python中方法和属性的区别

Bra*_*ang 13 python oop methods attributes class

我正在学习 python 并做一个关于课程的练习。它告诉我向我的类添加 nd 属性,向我的类添加一个方法。在我阅读练习之前,我一直认为这些是同一回事。两者有什么区别?

Ray*_*ger 22

术语

心智模型:

  • 变量存储在一个实例或类被称为属性
  • 函数存储在一个实例或类称为方法

根据 Python 的词汇表:

属性:与对象相关联的值,该值使用虚线表达式按名称引用。例如,如果对象 o 具有属性 a,它将被引用为 oa

方法:在类体内定义的函数。如果作为该类的实例的属性调用,则该方法将获取实例对象作为其第一个参数(通常称为 self)。请参阅函数和嵌套作用域。

例子

应用于实际代码的术语:

a = 10                          # variable

def f(b):                       # function  
    return b ** 2

class C:

    c = 20                      # class attribute

    def __init__(self, d):      # "dunder" method
        self.d = d              # instance attribute

    def show(self):             # method
        print(self.c, self.d) 

e = C(30)
e.g = 40                        # another instance variable
Run Code Online (Sandbox Code Playgroud)

  • 您是否刚刚通过在类定义之外执行“eg = 40”来创建并设置属性?我没有看到类定义中定义的类 C 的属性。这是典型/推荐的吗? (2认同)

Jer*_*bon 12

方法是属性,但并非所有属性都是方法。例如,如果我们有类

class MyClass(object):

    class_name = 'My Class'

    def my_method(self):
        print('Hello World!')
Run Code Online (Sandbox Code Playgroud)

这个类有两个属性,class_namemy_method。但只是my_method一种方法。方法是属于您的对象的函数。所有类都存在其他隐藏属性,但这就是您的练习可能要讨论的内容。

  • 当然,我确实说过吹毛求疵:)。但是,再一次,`x = []; x.sort 是 x.sort` *也评估为 `False`。* 因为,同样,该方法不*属于*实例。它在每次方法调用时动态绑定到实例*。相反,每次调用方法时都会创建一个新的方法对象!每次使用`my_instance.my_method` 访问方法** 时都会有一个方法对象**。所以,当然,`s = x.sort; s 是 s` 评估为 `True` (2认同)

Jam*_*Ang 9

一个快速、简单的解释。

属性==特征。方法 == 操作/动作。

例如,让我们描述一只猫(喵!)。

猫的属性(特征)是什么?它有不同的品种、名称、颜色、是否有斑点等。

猫的方法(动作)是什么?它可以喵喵叫、攀爬、抓挠你、毁坏你的笔记本电脑等。

注意区别,属性定义了猫的特征。

另一方面,方法定义动作/操作(动词)。

现在,记住上面的定义,让我们创建一个类 'cat'...meowww

class Cat():
Run Code Online (Sandbox Code Playgroud)

要创建属性,请使用 def init (self, arg1, arg2) -(如下所示)。

“self”关键字是对类的特定实例的引用。

def __init__(self, mybreed, name):
    
    # Attributes
    self.breed = mybreed
    self.name = name

# Operations/actions --> methods
def kill_mouse(self):
    print('Insert some method to kill mouse here')
Run Code Online (Sandbox Code Playgroud)

注意(上面)'mybreed' 是用户需要指定的输入参数,而 self.breed 是分配给 'mybreed' 参数的实例的属性。通常,它们是相同的(例如,两者的品种,self.breed = 品种)。在这里,它以不同的方式编码以避免混淆。

并且属性通常写为“self.attribute_name”(如上所示)。

现在,方法更像是动作或操作,您可以在类的主体内定义一个函数来执行某些操作,例如,杀死鼠标。方法还可以利用您在对象本身中定义的属性。

方法和属性之间的另一个主要区别是您如何调用它。

例如,假设我们使用上面定义的类创建了一个实例。

my_cat = Cat()
Run Code Online (Sandbox Code Playgroud)

要调用属性,请使用

my_cat.name
Run Code Online (Sandbox Code Playgroud)

或者

my_cat.breed
Run Code Online (Sandbox Code Playgroud)

对于方法,您调用它来执行某些操作。在 Python 中,您使用左括号和右括号调用方法,如下所示:

my_cat.kill_mouse()
Run Code Online (Sandbox Code Playgroud)