Python——实例属性、类属性、私有属性与实例方法、类方法、静态方法
原创声明:本文系博主原创文章,转载或引用请注明出处。
在Python中,对象的属性分为实例属性与类属性;对象的方法分为普通方法、类方法与静态方法。
一、属性:
实例属性在每创造一个实例时都会初始化一遍,不同的实例的实例属性可能不同;
类属性在创建类的时候初始化,不同实例的类属性都相同。如果实例显示的修改了"类属性",则"类属性"被实例属性覆盖,
若要再次访问或修改类属性,则只能通过 className.propertyName 来调用;当多个实例试图修改类属性时可能发生资源竞争,
必要时需要加锁进行同步。
1)实例属性:
实例属性没有规定必须在哪里定义,但是必须确保实例属性在调用之前已经被定义,因此常见的做法是在__init__中定义。
调用方法是: instanceName.propertyName 。
注意,定义类时,成员方法第一个参数为self,其实self也是一个形参表示的实例。
2)类属性:
在类的作用域内声明,为类及类的所有实例共有。
在内部用 className.propertyName 调用,如果在成员方法中不对 propertyName 进行修改,则也可以用 self.propertyName 调用;
在外部既可以用 className.propertyName ,又可以用 instanceName.propertyName 来调用。
3)私有属性(方法):
- _xx:常用来标记私有属性,但是外部依然可以访问更改
- __xx:外部不可通过 instanceName.propertyName 来访问或者更改,实际是解释器将其转化为 _className__propertyName 。
- __xx__:类的magic方法或解释器使用的一些全局变量的命名规则,要避免使用这种命名规则。
二、方法
1)普通类方法:
def method(self,...):
pass
2)静态方法:用@staticmethod装饰器修饰
不能访问实例属性,参数不能传入self,若传入self,则需要在调用时显示给定实例。
3)类方法:用@classmethod装饰器修饰
实例属性可以覆盖类属性,推荐用cls作入口参数。
静态方法与类方法都可以通过类或者实例来调用。其两个的特点都是不能够调用实例属性
【参考资料】