目录
17.1 封装性
定义:将一些数据封装到一个自定义类中。向类外提供必要的功能,隐藏实现的细节。
-
将一些数据封装到一个自定义类中
-
将数据与对数据的操作相关联,代码可读性更高。便于分工,便于复用,可扩展性强。
-
更符合人类的思考方式
-
初级封装:
在类中定义的属性 只能当前类中使用 如果想在其他地方使用 必须创建实例对象 并通过实例对象.属性名的方式进行访问
在一定程度上 会导致不合理的赋值
cp.price = -1000
高级封装
把属性隐藏起来 外部也不能访问这个属性 实例对象也访问不到 只能通过这个类提供的 特殊的访问和修改的方法才能对这个属性进行操作。
步骤:
1.给属性私有化
在属性名之前添加两个下划线
原来的属性: age
私有化之后: __age
2.给私有化的属性添加访问和修改的方法
访问方法:类外部需要获得这个被访问的属性时
修改方法:类外部需要对这个属性进行修改的时候 提供的方法
class Commodity:
def __init__(self, cid, name, price):
self.cid = cid
self.name = name
self.price = price
list_commodity_infos = [
Commodity(1001, "商品1", 10000),
Commodity(1002, "商品2", 10000),
Commodity(1003, "商品3", 52100),
Commodity(1004, "商品4", 20),
Commodity(1005, "商品5", 30),
]
def print_commodity_infos():
for commodity in list_commodity_infos:
print(f"编号:{commodity.cid},商品名称:{commodity.name},商品单价:{commodity.price}")
向类外提供必要的功能,隐藏实现的细节。
-
在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”或者“类对象.方法名(参数)”的形式调用这些属性或方法,而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。使用者不必了解具体的实现细节,只需要调用对外提供的功能。避免了外部对类内部数据的影响。
-
在python中用双下划线开头的方式将属性或方法隐藏起来(设置成私有的)
-
本质就是障眼法,实际也可以访问。
-
私有成员的名称被修改为:_类名__成员名
属性@property
-
公开的实例变量,缺少逻辑验证。私有的实例变量与两个公开的方法相结合,又使调用者的操作略显复杂。而属性可以将两个方法的使用方式像操作变量一样方便。
@property
def 属性名(self):
return self.__属性名
@属性名.setter
def 属性名(self, value):
self.__属性名= value
对象.属性名 = 数据
变量 = 对象.属性名
17.2 继承性
继承:重用现有类的功能,并在此基础上进行扩展,将相关类的共性进行抽象,统一概念,隔离变化。
继承分为两种:
一、单继承:就是括号里面只有一个类
继承顺序:如果父类和子类拥有同一个方法,那么子类会优先继承自己的方法和属性
二、多继承:就是括号里面有多个类
继承顺序:遵循就近原则
继承是什么?
子承父业 儿子继承父亲的产业
概念:万物皆对象 所有的对象都拥有一个公共的父类 叫做object
class Teacher(object):
pass
描述:Teacher继承了object类 拥有了object所有的属性和方法
继承可以随便继承吗?
小类继承大类
类是有大小之分 大小之分可以理解为是范围的大小
人类
中国人
美国人
...计算机 1
笔记本电脑
台式电脑
ipad
小的类型称之为子类 大的类型称之为父类
子类可以继承父类大部分的属性和方法 私有化的属性和方法不能被继承
17.2.1 在子类中调用父类的代码
class Animal:
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print("吃")
class Dog(Animal):
def