数据角度讲
定义:
将一些基本数据类型复合成一个自定义类型。
优势:
将数据与对数据的操作相关联。
代码可读性更高(类是对象的模板)。
行为角度讲
定义:
类外提供必要的功能,隐藏实现的细节。
优势:
简化编程,使用者不必了解具体的实现细节,只需要调用对外提供的功能。
私有成员:
作用:无需向类外提供的成员,可以通过私有化进行屏蔽。
做法:命名使用双下划线开头。
本质:障眼法,实际也可以访问。
私有成员的名称被修改为:_类名__成员名,可以通过_dict_属性或dir函数查看。
属性@property:
公开的实例变量,缺少逻辑验证。私有的实例变量与两个公开的方法相结合,又使调用者的操作略显复杂。而属性可以将两个方法的使用方式像操作变量一样方便。
定义:
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name= value
调用:
对象.属性名 = 数据 (赋值)
变量 = 对象.属性名 (取值)
说明:
通常两个公开的属性,保护一个私有的变量。
@property 负责读取,@属性名.setter 负责写入
只写:属性名= property(None(读), 写入方法名)
设计角度讲:
定义:
(1)分而治之
-- 将一个大的需求分解成为许多类,每个类处理一个独立的功能
-- 拆分好处:便于分工,便于服用,可扩展性强。
(2)封装变化
-- 将变化的地方独立封装,避免影响其他类
(3)高内聚
-- 类中各个方法都在完成一项任务,单一职责类
(4)低耦合
-- 类与类之间的关联性与依赖度要低(每个类独立)
-- 将一个大的需求分解成为许多类,每个类处理一个
作用:
便于分工,便于复用,可扩展性强
示例:
class MyClass:
y = 0
@classmethod
def fun1(cls):
pass
def fun2(self):
print(self.x)
def __init__(self,x):
self.x = x
# 私有变量
self.__y = 100
self.__z = 0
# 属性拦截了对变量的读写操作
@property
def x(self):
if self.__x < 0:
return 0
return self.__x
@x.setter
def x(self,value):
self.__x = value
# 只有 @property 的属性,称之为只读属性。
@property
def y(self):
return self.__y
# @z.setter
# def z(self, value):
# self.__z = value
# 定义只写属性
#1. 定义私有的写入方法
def __set_z(self, value):
self.__z = value
# z = property(读取方法,写入方法)
#2. 定义只写属性
z = property(None,__set_z)
# 建议使用类名 访问类成员
print(MyClass.y)
MyClass.fun1()
# 其实语法上可以通过对象地址访问类成员
c01 = MyClass(1)
print(c01.y)
c01.fun1()
# 实例方法 建议通过对象地址调用
c01.fun2()
# 实际也可以通过类名调用,但仍然需要传递对象地址
MyClass.fun2(c01)
c01.x = -1
print(c01.x)
# 只读属性
print(c01.y)
# c01.y = 200
c01.z = 200
# c01.set_z(200)
# print(c01.z)
print(c01._MyClass__z)