只读属性: 只能读取数据, 而不能修改数据的属性(一般指实例属性)
一、经典类和新式类
- 经典类: 没有继承自
object
的类, 2.0中, 没有父类的类就是经典类 - 新式类: 继承自
object
的类, 3.0中所有创建的类自动继承自object
在2.0中想要创建新式类, 必须继承自
object
二、property
的使用方式
- 文档:
1、方式一
- 定义类新式类
Person
, 将age
属性和两个方法关联起来:
# 2.0 中需要写上继承自object, 3.0中不用写
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) # 打印: 18
p.age = 20
print(p.age) # 打印: 20
print(p.__dict__) # 打印: {'_Person__age': 20}
复制代码
2、方式二
- 定义类新式类Person, 将age属性和两个方法关联起来:
# 3.0中不需要写 继承自object
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) # 打印: 18
p.age = 20
print(p.age) # 打印: 20
print(p.__dict__) # 打印: {'_Person__age': 20}
复制代码
三、使用property
设置只读属性
1、方式一
- 定义类新式类
Person
, 将age
属性和get
方法关联起来:
# 2.0 中需要写上继承自object, 3.0中不用写
class Person(object):
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
age = property(get_age)
复制代码
2、方式二
- 定义类新式类Person, 将age属性和两个方法关联起来:
# 3.0中不需要写 继承自object
class Person:
def __init__(self):
self.__age = 18
@property
def age(self):
return self.__age
复制代码
四、使用__setattr__
方法, 设置只读属性
- 当一个对象, 调用
对象.属性 = 值
时, 就会调用它的__setattr__
方法
class Person:
def __setattr__(self, key, value):
if key == 'age' and key in self.__dict__.keys():
pass
else:
self.__dict__[key] = value
复制代码
五、内置特殊属性
在类和对象中, 存在一些系统定义的属性
1、类属性
__dict__
: 查看类的属性__bases__
: 类的所有父类构成元组__doc__
: 类的文档字符串__name__
: 类名__module__
: 类定义所在的模块
2、实例属性
__dict__
: 实例的属性__class__
: 实例对应的类