属性原理、封装、类的调用

it2025-01-29  14

. 属性原理:

​ 本质:读取和写入函数

​ 价值:拦截

​ (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, "东北")
最新回复(0)