只读属性: 只能读取数据, 而不能修改数据的属性(一般指实例属性)
一、经典类和新式类
- 经典类: 没有继承自
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__: 实例对应的类