我知道以前也有人问过类似的问题,但每个网站对这些问题的定义似乎都不一样,我正试图遵循官方文档:就我目前所知:类属性是
假设上面所写的都是正确的,那么实例方法就是
我不确定我理解错了什么,但是python文档的术语与我所见过的其他站点完全不同。任何帮助都将非常感谢。谢谢!
类的所有实例的类属性都是相同的,而每个实例的实例属性都是特定的。实例属性是针对每个实例的特定数据的,类的所有实例都应该使用该类的类属性。
"实例方法"是一个特定的类属性,它接受类的实例作为第一个属性,并假定对该实例进行操作。
"类方法"是类中定义的一个方法,它接受类作为第一个属性而不是实例(这就是为什么are类方法)。
你可以通过访问a.b. dict__很容易地看到类属性:
1 2 3 4 5 6 7 | 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} |
实例属性为
1 2 3 4 | a = A() a.class_method() print a.__dict__ # {'instance_attribute': 'I am instance attribute'} |
一些来自官方python文档的有用链接,我希望这些链接不会让您更加困惑,并给出更清晰的理解……
Python类进入python, 5.8。引入类属性python getattr和setattr的定义Python中的类方法是用来做什么的?类和实例方法之间的区别要回答这个问题,首先需要考虑python如何查找属性。我假定您知道实例是什么。作为复习…
1 2 3 4 5 6 7 8 9 10 11 | 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() |
类属性是在类级别定义的。实例属性在实例级定义(通常通过
1 | instance.another_instance_attribute = '...' |
注意,如果实例属性没有"影子"它,则可以在实例上查找类属性。
1 | print(instance.class_attribute) |
现在的方法。方法完全是另一种动物。
1 | SomeClass.method |
绝对是类的属性。
1 | instance.method |
分类有点棘手。实际上,当python看到这个语句时,它实际上执行以下操作:
1 | SomeClass.method.__get__(instance, SomeClass) |
奇怪。这里发生的是函数是描述符。因为它们有一个
你似乎对这些概念掌握得很好。很难找到以通用方式解释的信息,特别是像python这样使用广泛的语言。我主要是附和您的正确假设,并在此过程中进行一些小的调整。
类属性是所有将从类创建的对象共享的特征。例如,如果我们定义一个
1 2 | class Clock: class_hours = 12 |
它由类的所有实例共享,任何实例都可以访问它以供参考。
类实例是我们用来定义从类创建的对象的个体特征的实际数据。再次使用
1 2 3 4 5 6 | class Clock: class_hours = 12 def __init__(self, hours): if (hours <= class_hours): self.hours = hours |
请记住,在构造函数中使用
实例方法是我们在类中定义的方法,它可以操作我们在构造函数中定义的类实例数据。再次回到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
这允许我们更改代码中已经创建的
我希望这对您有帮助,并且尽可能清晰。如果我含糊不清或忽略了您不理解的任何术语,请让我知道,以便我可以更新我的答案,使其尽可能清晰。
Class attributes-
are everything listed in the class Classname: code block, It can be above or below of any method.Instance attribute - which is created by using instance.attr or self.attr(here self is instance object only)
1 2 3 4 5 6 7 | 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 attributes and instance objects - You can consider class object as a parent of all of its instance objects. So instance object can access attribute of class object.However any thing defined under class body is class attribute only.
1 2 3 4 5 6 7 8 9 10 11 | 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" |
Instance Method - Method which is created by def statement inside class body and instance method is a Method which first argument will be instance object(self).
But all instance methods are class attributes, You can access it via instance object because instances are child of class object.
1 2 3 4 5 6 7 8 9 10 | >>> class Base: def ins_method(self): pass >>> b = Base() >>> Base.__dict__ {'__module__': '__main__', '__doc__': None, 'ins_method': <function ins_method at 0x01CEE930>} >>> b.__dict__ {} |
您可以通过使用类对象来访问实例方法,方法是将实例作为它的第一个参数传递
1 | 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/