![](https://img.haomeiwen.com/i748014/785da2d2309f84c3.png)
1 通过属性私有化+只读属性实例方法
- 基本操作
class Person:
def __init__(self):
self.__age = 18
def getAge(self):
return self.__age
p1 = Person()
# print(p1.__age) # error
# 通过实例方法读取
print(p1.getAge())
- 优化(通过@property 装饰器)
让实例可以通过p1.age
方式读取属性,而不是通过实例方法,同时p1.age = 1
操作是要报错,而不是给实例添加 age 属性
# 1、让类继承object
class Person(object):
def __init__(self):
self.__age = 18
#2、通过@property 让实例对象以".age"的方式, 来使用这个方法
@property
def age(self): #3、方法名直接使用属性名
return self.__age
p1 = Person()
print(p1.age)
# p1.age = 10 # error
2 property
2.1 property
作用:将一些“属性的操作方法”关联到某一个属性中。作用:将一些“属性的操作方法”关联到某一个属性中。
![](https://img.haomeiwen.com/i748014/655dfcafcc5b0a26.png)
2.2 类区分
经典类
:没有继承(object)
新式类
:有继承(object)
python2.x 定义类时,默认不继承 object
python3.x 定义类时,默认继承 object
可通过类.__base__
打印查看新定义类基类
- 注意:建议使用新式类,且一般让类显式继承 object,这样 python2.x 或3都能够使用新式类
2.3 属性的读写 - property 在新式类和经典类中的使用方式
2.3.1 新式类
- 使用方式一,property 类的使用
class Person(object):
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
def set_age(self, value):
self.__age = value
age = property(get_age, set_age)
p = Person()
print(p.age)
p.age = 22
print(p.age)
print(p.__dict__) # 确定赋值时候并不是给实例添加 age 属性
>>>> 打印结果
18
22
{'_Person__age': 22}
- 使用方式二,参考上图 property 的介绍时给出的内部实现例子,使用其中的拆分写法
class Person(object):
def __init__(self):
self.__age = 18
@property
def age(self):
return self.__age
@age.setter # 因为是对 age 进行装饰器,所以 get 方法需要先写上
def age(self, value):
self.__age = value
p = Person()
print(p.age)
p.age = 22
print(p.age)
print(p.__dict__)
>>>> 打印结果
18
22
{'_Person__age': 22}
问题:@property 与 @property.setter 的关系
2.3.2 经典类
结果:不管是方式一(使用 property 类方式),还是方式二(参考property 类的内部实现方式),都是只能管理 get 方式,其他方法不能被管理到,即使是把其他方法写上(如:set 方法),进行赋值时候也就是给实例对象添加新的属性而已
以下代码环境在 python2.x
- 使用方式一,property 类的使用
# _*_ encoding:utf-8 _*_
class Person:
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
def set_age(self, value):
self.__age = value
age = property(get_age, set_age)
p = Person()
print(p.age)
p.age = 22
print(p.age)
print(p.__dict__) # 确定赋值时候并不是给实例添加 age 属性
>>>> 打印结果
18
22
{'age':22, '_Person__age': 18}
- 使用方式二,参考上图 property 的介绍时给出的内部实现例子,使用其中的拆分写法
# _*_ encoding:utf-8 _*_
class Person:
def __init__(self):
self.__age = 18
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
self.__age = value
p = Person()
print(p.age)
p.age = 22
print(p.age)
print(p.__dict__)
>>>> 打印结果
18
22
{'age':22, '_Person__age': 18}
- 所以建议使用新式类,这样以后使用属性更加方便
网友评论