1、实例属性
实例属性,就是赋给由类创建的实例的属性,实例属性属于它所属的实例,不同实例之间的实例属性可以不同。
例:设置实例属性
![](https://img.haomeiwen.com/i17015141/2625718bb8aeb8f8.png)
![](https://img.haomeiwen.com/i17015141/9cb3c11e4d9f99ad.png)
由于p2实例中没有设置过name属性,因此当Python解释器执行到这行代码时,会抛出属性错误异常。由此可以看出,每个实例之间的属性是分别独立的,属性之间不能共享。
例:通过__init__()方法设置实例属性
![](https://img.haomeiwen.com/i17015141/97479696dad6cb27.png)
![](https://img.haomeiwen.com/i17015141/03e80a38299b61ce.png)
当创建实例时,会自动调用__init__()方法,通过该方法为属性赋值。
通过上述方式设置的实例属性都可以被外部访问,但是在实际开发中,可能一些属性不需要被外部访问,就需要控制实例属性的访问权限。
Python中,属性的访问权限是由属性名控制的,如果一个属性由双下划线(__)开头,该属性就无法被外部访问。如果外部需要访问这种变量,可以通过特定的实例方法来访问。
例:属性访问控制权限
![](https://img.haomeiwen.com/i17015141/2f3f34935dcf804a.png)
![](https://img.haomeiwen.com/i17015141/5e09a24cf7c22883.png)
因为__address属性外部无法访问,因此Python解释器执行到这段代码时,会抛出属性错误异常。
2、类属性
在类中直接定义的属性被称之为类属性,与实例属性不同的是,类属性会在所有的实例对象中共享。类属性有且只有1份,创建的实例都会继承自唯一的类属性,如果在类上绑定一个属性,那么所有的实例都可以访问类属性,且访问的类属性是同一个,一旦类属性改变就会影响到所有的实例。
例:设置类属性
![](https://img.haomeiwen.com/i17015141/a4627161d692a3bd.png)
![](https://img.haomeiwen.com/i17015141/92853eb06474614f.png)
类属性在实例之间共享,因此类创建的实例都可以访问到类属性。
例:实例对象修改类属性
![](https://img.haomeiwen.com/i17015141/e37d32c19a124216.png)
![](https://img.haomeiwen.com/i17015141/d41db5fc94395678.png)
![](https://img.haomeiwen.com/i17015141/5b097c06c0677c36.png)
3、实例属性与类属性重名
例:当实例属性与类属性重名时,实例属性优先级更高
![](https://img.haomeiwen.com/i17015141/1bfb9deed8111ce0.png)
![](https://img.haomeiwen.com/i17015141/39181448073128a8.png)
4、实例方法
在类中,定义的普通方法都是实例方法。实例方法隐含的参数为类实例self。实例方法只能被实例调用。
例:定义实例方法
![](https://img.haomeiwen.com/i17015141/6aa74576e2e035cd.png)
![](https://img.haomeiwen.com/i17015141/a71bbda4bc53fd4d.png)
例:类对象调用实例方法
![](https://img.haomeiwen.com/i17015141/e9867fe5da9e4bdb.png)
![](https://img.haomeiwen.com/i17015141/d5eef3f6689791a9.png)
5、类方法
Python中,再类中定义类方法,需要在方法上加上@classmethod装饰器,同时方法中传入cls作为参数,代表当前的类对象,类方法中,可以访问当前类中的类属性,但是不能访问实例属性。
![](https://img.haomeiwen.com/i17015141/26a9e846bb3c4b26.png)
![](https://img.haomeiwen.com/i17015141/ea56ea82b6b23c0e.png)
![](https://img.haomeiwen.com/i17015141/c943325714fa29e8.png)
![](https://img.haomeiwen.com/i17015141/c1bc2e108eaba641.png)
![](https://img.haomeiwen.com/i17015141/3f19cad30ac22b85.png)
![](https://img.haomeiwen.com/i17015141/43a93245cdddc988.png)
6、静态方法
例:定义静态方法
![](https://img.haomeiwen.com/i17015141/08312fb710de1ab7.png)
静态方法可以通过实例对象调用,也可以通过类对象调用。
例:静态方法访问类属性与实例属性
![](https://img.haomeiwen.com/i17015141/359ec63f6a915de8.png)
![](https://img.haomeiwen.com/i17015141/07d141f57ea6f7ae.png)
总结
![](https://img.haomeiwen.com/i17015141/c65106deec435a2f.png)
实例方法(普通方法)——————————————————————— 随着实例属性的改变而改变
类方法(无论是类调用还是实例调用)——————————————— 都是类属性的值,不随实例属性的变化而变化
静态方法 —————————————————————————————— 不可以访问类属性,故直接输出传入方法的值
网友评论