【问题标题】:Difference between methods and attributes in pythonpython中方法和属性的区别
【发布时间】:2017-09-20 02:50:44
【问题描述】:

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

【问题讨论】:

标签: python class oop methods attributes


【解决方案1】:

术语

心智模型:

  • 存储在实例或类中的变量称为attribute
  • 存储在实例或类中的函数称为method

根据 Python 的词汇表:

属性:与被引用的对象关联的值 使用虚线表达式命名。例如,如果一个对象 o 有一个 属性 a 将被引用为 o.a

方法:在类体内定义的函数。如果称为 该类实例的属性,该方法将获得 实例对象作为它的第一个参数(通常称为 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

【讨论】:

  • 次要修复:d = C()d.e = 30 应该不缩进。
  • 您是否只是通过在类定义之外执行e.g = 40 来创建和设置属性?我没有看到类定义中定义的类 C 的属性。这是典型的/推荐的吗?
  • 我认为要澄清的真正有趣的区别是方法与恰好是函数的属性。
【解决方案2】:

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

class MyClass(object):

    class_name = 'My Class'

    def my_method(self):
        print('Hello World!')

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

【讨论】:

  • Nitpick:方法属于类
  • 我不想在这样的事情上陷入困境。例如,[].sort is [].sort 的计算结果为 False,因为每个实例都有一个方法对象。
  • ... 通常。至少,my_method 可以。不过,您可以为实例动态添加方法。
  • 当然,我确实说过 nitpick :)。但是,又一次,x = []; x.sort is x.sort 也计算为False 因为,同样,该方法不属于实例。它在每个方法调用上动态绑定到实例。相反,每次调用方法时都会创建一个新的方法对象! 每次访问方法时使用my_instance.my_method 有一个方法对象。所以,当然,s = x.sort; s is s 的计算结果为 True
  • 很好的解释。我们可以使用内置函数getattr() 验证以下内容。因此方法确实是一个类的属性(类属性),因此,这些方法也是实例属性。
【解决方案3】:

快速、简单的解释。

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

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

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

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

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

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

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

class Cat():

要创建属性,使用 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')

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

而属性通常写成'self.attribute_name'(如上图)。

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

方法和属性之间的另一个关键区别是你如何调用它。

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

my_cat = Cat()

要调用属性,请使用

my_cat.name

my_cat.breed

对于方法,你调用它来执行一些动作。在 Python 中,你调用方法时带有一个左括号和右括号,如下所示:

my_cat.kill_mouse()

【讨论】:

    【解决方案4】:
    class example:
        global a
        # a=0
    
        def __init__(self,x,y):
            self.fname=x
            self.lname=y
        def show(self):
            return "first name: {} & Last name: {}".format(self.fname,self.lname)
    
    obj1=example('reyan','ishtiaq')
    obj2=example('ishtiaq','reyan')
    
    print('method associated with obj1: '+ obj1.show())
    print('method associated with obj2: '+ obj2.show())
    
    obj1.a=20
    obj2.a=30
    
    print(obj1.a)
    print(obj2.a)
    

    输出: 与 obj1 关联的方法:名字:reyan 和姓氏:ishtiaq....... 与 obj2 关联的方法:名字:ishtiaq & 姓氏:reyan....... 20 30

    【讨论】:

    • 每个方法都属于一个对象,就像方法 show(self) => show(obj1) for obj1
    【解决方案5】:

    方法是在类中定义的函数。属性是在类中定义的实例变量。

    例子:

    class Example(object):
        def __init__(self, name):
            self.name = name
        def hello(self):
            print 'Hi, I am ' + self.name
    

    这里hello是一个方法,name是一个属性。

    【讨论】:

    • 对于 Python 3,您不需要从 object 继承,并且您需要在 print 调用中使用括号。将两个字符串组合成print 组合然后丢弃它对我来说是模糊的;可能改用字符串格式(尽管我认为没有任何性能差异)。
    • 同意。我只需要一个原始问题的简单示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2011-02-02
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2020-12-14
    • 2010-11-14
    相关资源
    最近更新 更多