python 类 实例 理解记录
python 类 方法
class Person(object):
# 类属性
name = "xiaohong"
#name_list = ["xiaohong","xiaoming"]
# 实例方法
def set_age(self):
# 类属性 复制一份数据到 实例中
print(self.name is Person.name,"1")
# 重新赋值后可以看到 类属性和实例属性 并不是同一个东西,只是值相同,名称相同
# 实例属性
self.name = "xh"
print(self.name is Person.name,self.name,Person.name,"2")
self.score = 12
#类 方法
@classmethod
def get_value(cls):
#类方法 访问的是 类属性 不是复制
print(cls.name)
cls.name = "xj"
print(cls.name,Person.name)
@classmethod
def get_score(cls):
print(cls.score)
Person().set_age()
Person.get_value()
print(Person.name) # 访问类属性
print(Person().name) #访问实例属性 实例属性没有初始化但是有值,是类属性复制了一份到 实例中
try:
print(Person.age)
except Exception as e:
print(e.args)
Person.age = 12 #给 类 添加属性
print(Person.age)
print("######测试 类方法 不能访问 实例属性")
A = Person()
print(A.set_age())
A.get_score()
===================
Traceback (most recent call last):
File "D:/pycharm_project/helloworld/test_unittest/test02.py", line 40, in <module>
True 1
False xh xiaohong 2
xiaohong
xj xj
xj
xj
("type object 'Person' has no attribute 'age'",)
12
######测试 类方法 不能访问 实例属性
True 1
False xh xj 2
None
A.get_score()
File "D:/pycharm_project/helloworld/test_unittest/test02.py", line 24, in get_score
print(cls.score)
AttributeError: type object 'Person' has no attribute 'score'
名词:
- 实例方法
无装饰器
- 实例属性
- 类方法
@classmethod
- 类属性
- 静态方法
@staticmethod
类属性
- 在实例方法中可以直接访问类属性的值
(因为类属性会复制一份数据到实例中,只要实例中没有对 对应实例的属性进行重新赋值就可以访问到该数据) - 不可以直接对类属性进行修改
- 或者直接在 实例方法中用类进行访问 和重新赋值都是可以的
Person.name
实例属性:
- 在实例方法中可以直接修改和访问实例属性
- 在类方法中不可以直接访问或修改实例属性
- 但是可以通过访问实例方法去访问或者修改实例属性
实例方法 和 类方法:
- 实例方法可以访问类方法
- 类方法可以访问实例方法
静态方法
- 实例方法和类方法都可以访问静态方法
- 静态方法,不可以直接访问 类属性,实例属性,类方法和实例方法也不可以直接访问,(可以通过先访问类或者建实例去间接访问)
- 此方法就像不是定义在类内,和类外的方法唯一区别,需要通过实例或者类才能访问到该方法
- 静态方法直接也不可以直接访问,相互独立,同样需要用实例或者类进行间接访问
类属性会 赋值一份到 实例中,那有什么方法不复制到实例中吗?
__name = "xiaohong"
在类中使用下划线进行设置属性,则不会复制到 实例中