Python中的类属性,实例属性和实例方法之间的区别

时间:2016-02-20 07:06:01

标签: python

我之前曾经问过类似的问题,但每个网站似乎都有不同的定义,我试图按照官方文档进行操作: 据我所知,到目前为止:
- 类属性是class Classname:代码块中列出的所有内容,包括__init__函数上方的变量声明,静态方法,类方法以及涉及self实例的方法
链接了解更多信息:https://docs.python.org/2/tutorial/classes.html#class-objects
- 实例属性都是:1。)class Classname:代码块中列出的每个函数,除了__init__函数和&之外的变量声明之外的所有其他函数。 2.)数据属性,当我们使用instance.attr并将其设置为等于某个值时 链接了解更多信息:https://docs.python.org/2/tutorial/classes.html#instance-objects

假设我上面写的所有内容都是正确的,我会说Instance方法是class Classname:代码块中的任何函数,因为我们可以将每个方法应用于实例对象,或者它可能只是涉及{{{1}的函数。 1}}

我不确定我的理解是错误的,但是python文档的术语与我见过的其他网站完全不同。任何帮助将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:3)

要回答这个问题,你需要先考虑python如何查找属性。我假设你知道实例是什么。作为复习。 。

class SomeClass(object):

    class_attribute = 'This -- Defined at the class level.'

    def __init__(self):
        self.instance_attribute = 'This -- Defined on an instance.'

    def method(self):
        pass

instance = SomeClass()

类属性在类级别定义。实例属性在实例级别定义(通常通过self.xyz = ...)。实例属性也可以猴子修补到实例上:

instance.another_instance_attribute = '...'

请注意,如果实例属性没有“遮蔽”它,则可以在实例上查找类属性。

print(instance.class_attribute)

现在的方法。方法完全是另一种动物。

SomeClass.method

绝对是班上的一个属性。

instance.method

分类有点棘手。实际上,当python看到该语句时,它实际执行以下内容:

SomeClass.method.__get__(instance, SomeClass)

怪异。所以这里发生的是函数是描述符。由于它们具有__get__方法,因此它被调用,返回值(在本例中)是一个知道self是什么的新函数。正常术语是“实例方法”和“绑定方法”。我想有些人可能认为它是一个实例属性,但是,我不确定这是完全正确的(即使你通过实例访问它)

答案 1 :(得分:3)

对于类的所有实例,类属性相同,而实例属性对于每个实例都是特定的。实例属性用于特定于每个实例的数据和应该由类的所有实例使用的类属性。

“实例方法”是一个特定的类属性,它接受类的实例作为第一个属性,并假设使用该实例进行操作。

“类方法”是在类中定义的方法,它接受类作为第一个属性而不是实例(这就是类方法的原因)。

您可以通过访问Python Classes

轻松查看类属性
class A:
   class_attribute = 10
   def class_method(self):
       self.instance_attribute = 'I am instance attribute'

print A.__dict__
#{'__module__': '__main__', 'class_method': <function class_method at 0x10978ab18>, 'class_attribute': 10, '__doc__': None}

实例属性为A().__dict__

a = A()
a.class_method()
print a.__dict__
# {'instance_attribute': 'I am instance attribute'}

官方python文档和SO的一些有用的链接,我希望不会让你更加困惑,并给予更清晰的理解......

答案 2 :(得分:0)

  

类属性 -    是Classname:code block中列出的所有内容,它可以高于或低于任何方法。

     

Instance属性 - 使用instance.attr或self.attr创建(此处self只是实例对象)

class Base:
  cls_var = "class attribute"
  def __init__(self):
    self.var = "instance attribute"
  def method(self):
    self.var1 = "another instance attribute"
  cls_var1 = "another class attribute"
  

类属性和实例对象 - 您可以将类对象视为其所有实例对象的父对象。因此实例对象可以访问类对象的属性。但是在类体下定义的任何东西都只是类属性。

class Base:
  cls_var = "class attribute"
  def __init__(self):
    self.var = "instance attribute"
b = Base()
print b.var                                     # it should print "instance attribute"
print b.cls_var                                 # it should print "class attribute"
print Base.cls_var                              # it should print "class attribute"
b.cls_var = "instance attribute"
print Base.cls_var                            # it should print "class attribute"
print b.cls_var                                # it should print "instance attribute"
  

实例方法 - 由类体和实例方法中的def语句创建的方法是第一个参数将是实例对象(self)的方法。   但是所有实例方法都是类属性,您可以通过实例对象访问它,因为实例是类对象的子类。

>>> class Base:
    def ins_method(self):
        pass


>>> b = Base()
>>> Base.__dict__
{'__module__': '__main__', '__doc__': None, 'ins_method': <function ins_method at 0x01CEE930>}
>>> b.__dict__
{}

您可以通过传递实例作为第一个参数 -

来使用类对象来访问实例方法
Base.ins_method(Base())

你可以参考我写的这两篇文章,这些文章有关于图解释的相同主题,并将你的查询发给我 - http://www.pythonabc.com/python-class-easy-way-understand-python-class/ http://www.pythonabc.com/instance-method-static-method-and-class-method/

答案 3 :(得分:0)

你似乎对这些概念有了相当不错的把握。很难找到以通用方式解释的信息,尤其是像python这样广泛使用的语言。我大部分都会回应你的正确假设,并在此过程中进行一些小的调整。

类属性是将从类共享创建的所有对象的特征。例如,如果我们定义一个clock类,我们会将一个类属性定义为时钟中可能的小时数。

class Clock:
    class_hours = 12

它由Class的所有实例共享,并且可以被任何实例访问以供参考。

类实例是我们用于定义从类创建的对象的单个charactaristics 的实际数据。再次使用clock类示例,这将是我们在一行代码中创建时钟时设置时钟的实际小时数(我们还可以引用我们的类属性以确保它在可接受的参数范围内):

class Clock:
    class_hours = 12

    def __init__(self, hours):
        if (hours <= class_hours):
            self.hours = hours

请记住,在构造函数中使用if语句并不是一种好的做法,但这只是为了清楚起见。如果您真的想要实现此示例,则可以使用实例方法来确保小时在定义的边界内。

实例方法是我们在类中定义的方法,可以操作我们在构造函数中定义的类实例数据。再次返回clock示例,我们可以定义一个更改时钟的小时,分​​钟或秒的方法:

class Clock:
    class_hours = 12
    class_minutes = 60
    class_seconds = 60

    def __init__(self, hours, minutes, seconds):
        self.hours = hours
        self.minutes = minutes
        self.seconds = seconds

    def setTime(new_hour, new_minute, new_second):
        self.hours = new_hour
        self.minutes = new_minute
        self.seconds = new_second

这允许我们更改我们已在代码中创建的clock实例。例如,调用clock.setTime(11,49,36)会将该特定时钟实例设置为11:49:36。

我希望这对您有所帮助并尽可能明确。如果我对您不理解的任何术语含糊不清或掩饰,请告诉我,以便我能够尽快更新我的答案。