- 类属性一般定义在类的方法外面,实例属性定义在类的方法内部(既可以是初始化构造函数也可以是其他的类方法)
- 定义在构造函数中的实例属性会在类实例化后调用__dict__可以直接查看,而定义在实例方法中的实例属性需要在调用该方法后方可用__dict__来查看。
- 类属性和实例属性都可以是公有属性和私有属性,公有属性可以通过类名.属性名和实例名.属性名访问,私有属性需要用特殊的方式访问,建议不要强行去访问,但是在类的内部可以用类名.属性名和实例名.属性名访问和修改。对私有属性通过不同的实例方法实现访问,也就是所谓的封装,同时开放接口供外部访问
- 打印类.__dict__是不显示实例属性的,打印实例.__dict__可以显示所有被执行过的实例属性(放在构造函数中的会直接显示,放在其他方法中的只有在方法调用后才会显示)
class Person():
name='jacky'
def __init__(self):
self.age=18
def test(self):
self.country='China'
print('打印未实例化类属性:',Person.__dict__)
p=Person()
print('打印实例化后类属性:',Person.__dict__)
print('打印实例化后的实例属性:',p.__dict__)
p.test()
print('打印调用test方法后的类属性:',Person.__dict__)
print('打印调用test方法后的实例属性:',p.__dict__)
![对比运行结果](https://i-blog.csdnimg.cn/blog_migrate/63720f09770d4d6feffac04d2729a647.jpeg)
- 当在方法中通过类名.属性名,对类属性更改时可以改变类属性
- 当在方法中通过self.属性名,对类属性更改时只改变实例的属性
因为当类实例化时候会开辟内存空间来储存被使用或者初始化的属性,个人理解是类本身占用一个储存空间,而每实例一次就创建一个内存空间。
class People():
__name='jacky'
print(People._People__name)
class Human():
country='China'
def __init__(self,name,age):
self.name=name
self.age=age
self.country='US'
Human.country='England'
def eat(self):
self.name='lucy'
print(Human.country)
h=Human('jack',30)
print(Human.country)
print(h.country)
print(Human.__dict__)
print(h.__dict__)
h.eat()
print(h.__dict__)