## 类属性
**绑定类属性的两种方法**
1、在类对象内部方法中,语法格式:
```
属性名 = 属性值
```
2、在类对象外部,Python是动态语言,在类对象创建后可对其动态地绑定属性。语法格式:
```
类对象.属性名 = 属性值
```
如果指定名称的类属性已经存在,则是对类属性进行修改。
**访问类属性的两种方法**
1、在类对象内部方法中,语法格式:
```
类对象.属性名
```
2、在类对象外部有两种方式,语法格式:
```
类对象.属性名
实例对象.属性名
```
类对象的所有实例对象都有一个指向类对象的指针,所以类对象的所有实例对象都可以访问类属性。
**类对象绑定实例属性示例**
之所以添加前缀"类对象",是为了表明类属性被哪个类对象所绑定。
```
class MyClass():
# 在类对象内部(方法外)绑定类属性
ca1 = 18
def do_sth(self):
# 在类对象内部(方法中)访问类属性
print(MyClass.ca1)
def do_another(self):
# 在类对象内部(方法中)访问类属性
print(MyClass.ca2)
mc = MyClass()
# 在类对象外部调用方法, 使得在类对象内部(方法中)访问类属性
mc.do_sth()
# 在类对象外部通过类对象访问类属性
print(MyClass.ca1)
# 在类对象外部通过实例对象访问类属性
print(mc.ca1)
# 在类对象外部绑定类属性
MyClass.ca2 = 56
# 在类对象外部通过类对象访问类属性
print(MyClass.ca2)
# 在类对象外部通过实例对象访问类属性
print(mc.ca2)
# 在类对象外部修改绑定的类属性值
MyClass.ca2 = 73
# 在类对象外部通过类对象访问类属性
print(MyClass.ca2)
# 在类独享外部通过实例对象访问类属性
print(mc.ca2)
# 在类对象外部调用方法, 使得在类对象内部访问类属性
mc.do_another()
```
## 实例属性与类属性访问区别
访问实例属性和类属性都可以通过`实例对象.属性名`的方式。当通过`实例对象.属性名`的方式访问属性时,会先查找指定的实例对象中有没有指定名称的实例属性,如果没有在查找对应的类对象中有没有指定名称的类属性。所以当通过`实例对象.属性名`的方式访问属性时,如果实例属性和类属性同名,实例属性会屏蔽掉类属性。
当通过实例对象.属性名 = 属性值的方式绑定属性时,这里的属性只表示实例属性(因为类属性没有这样的绑定方式),所以,只会查找指定的实例对象有没有绑定指定名称的实例属性,如果没有则进行绑定,如果已经绑定则对属性值进行修改。
```
class Person():
age = 18
p = Person()
# 在实例对象p中没有找到名为age的实例属性,然后在类对象Person中找到了名为age的类属性
print(p.age)
# 打印名为age的类属性
print(Person.age)
# 给实例对象p绑定实例属性
p.age = 19
# 实例属性屏蔽掉了同名的类属性
print(p.age)
# 打印名为age的类属性
print(Person.age)
# 删除实例对象p绑定的实例属性
del p.age
print(p.age)
p1 = Person()
p2 = Person()
p1.age +=2
print(Person.age)
print(p1.age)
print(p2.age)
Person.age +=3
print(Person.age)
print(p1.age)
print(p2.age)
```