. 属性原理:
本质:读取和写入函数
价值:拦截
(1)调用函数
(2)绑定下面函数
(3)返回值给函数名赋值
# 问题:限制数据有效范围 class Wife: def __init__(self, age): # 因为先创建的类变量,所以本行代码操作的是类变量 self.age = age # 负责读取数据 的过程(验证/修改) def get_age(self): # 操作私有变量 return self.__age # 负责写入数据 的过程(验证/修改) def set_age(self, value): self.__age = value # 创建类变量与实例变量同名 # 创建属性对象 + 绑定读取函数 age = property(get_age) # 绑定写入函数(需要重新给变量age赋值) age = age.setter(set_age) print(age) w01 = Wife(30) w01.age = 40 print(w01.age). 属性各种写法:读写、只读、只写
# 1. 读写属性 # 快捷键:props + 回车 class MyClass: def __init__(self, data=0): self.__data = data @property def data(self): return self.__data @data.setter def data(self, value): self.__data = value m01 = MyClass(10) m01.data = 20 print(m01.data) # 20 # 2. 只读属性 # 快捷键:prop + 回车 # 适用性:通常类中确定的数据,只给类外读取时使用. class MyClass: def __init__(self): self.__data = 10 @property def data(self): return self.__data m01 = MyClass() # m01.data = 20 # 不能修改 print(m01.data) # 10 # 3. 只写属性 # 快捷键:无 class MyClass: def __init__(self, data=0): self.data = data # 创建属性对象 data = property() @data.setter def data(self, value): self.__data = value m01 = MyClass(10) m01.data = 20 # print(m01.data) # 不能读取 print(m01.__dict__). 封装设计思想:分而治之、变则疏之
原则:类和类行为不同、对象和对象则数据不同
需求:老张开车去东北
老张——>开车(去)
车 ——>车类(行驶)
# 跨类调用1 # 语法:直接创建对象 # 语义:人去东北创建新车 class Person: def __init__(self, name=""): self.name = name def go_to(self, pos): print("去", pos) car = Car() car.run() class Car: def run(self): print("汽车在行驶") # 使用对象区分数据不同 lz = Person("老张") ll = Person("老李") ls = Person("老孙") lz.go_to("东北"). 跨类调用(2):
语法:在构造函数中创建对象
语义:老张开自己的车去东北
缺点:人类和车类紧耦合
class Person: def __init__(self, name=""): self.name = name self.__car = Car() def go_to(self, pos): print("去", pos) self.__car.run() class Car: def run(self): print("汽车在行驶") lz = Person("老张") lz.go_to("东北"). 跨类调用(3):
语法:通过参数传递对象
语义:老张用根据自己需求的交通工具去东北
class Person: def __init__(self, name=""): self.name = name def go_to(self, car, pos): print("去", pos) car.run() class Car: def run(self): print("汽车在行驶") lz = Person("老张") car = Car() lz.go_to(car, "东北")