1,封装:把多个东西打包放在一个地方
2,面向对象封装定义:将多个数据打包/封装到一个自定义的类里,对类外提供必要的功能,隐藏实现的细节。
分析:
将多个数据打包/封装到一个自定义的类里:
使思路清晰,将数据和数据的操作相关联,使代码可读性更高
#封装
'''commodity_list=[
{"cid":1001,"name":"小明","price":"12"},
{"cid":1002,"name":"小慧","price":"123"},
{"cid":1003,"name":"小李","price":"1245"},
{"cid":1004,"name":"小孙","price":"1235"},
]
def print_commodity():
for commodity in commodity_list:
print(f"编号:{commodity['cid']}--商品的名称:{commodity['name']}")
print_commodity()
'''
#做类
class Commodity:
#ALT 回车
def __init__(self,cid,name,price):
self.cid = cid
self.name = name
self.price = price
commodity_list = [
Commodity(1001,'小明',1679)
]
def print_commodity():
for commodity in commodity_list:
print(f"编号:{commodity.cid}--商品的名称:{commodity.name}")
print_commodity()
写程序的本质就是定义一系列的数据,再定义一系列的功能来操作数据
拿到大需求,先把需求分解为多个类;
类与类之间是行为上的不同,对象与对象间是数据上的不同。便于分工,使代码可读性更高
可扩展性强
对类外提供必要的功能,隐藏实现的细节:
无关紧要的功能不对外提供
class Atm:
def card(self):
pass
def auth(self):
pass
def input(self):
pass
def task_money(self):
pass
def draw_money(self):
self.card()
self.auth()
self.input()
self.task_money()
。。。。。。
Pyton中实现隐藏通过私有化做的,在命令时使用双下划线隐藏
#例
class A:
__X = 1
def __init__(self,name):
self.__name = name
def __foo(self):
print('run foo')
def bar(self):
self.__foo() #self._A__foo
print('from bar')
print(A.__X) #实现了隐藏功能
#python是通过变形的操作来帮助实现隐藏东西
#变形特点:
#在类的外部,无法直接访问
#在类的内部可以直接使用,在定义阶段这种变形就已经产生了
class GirlFriend:
gender = '女'
def __init__(self,name,age,weight):
self.name = name
self.__age = age #self.set_age(age)
self.__weight = weight
def get_age(self):
return self.__age
def set_age(self,value):
if 18<=value<=20:
self.__age=value
else:
raise ValueError("不要")
G1 = GirlFriend("小明",50,300)
#类名加括号做实例化,做实例化就会触发__init__方法的执行
#公开的实例属性,缺少逻辑验证;私有的实例属性,配合两个公开的方法使用
class GirlFriend:
gender = '女'
def __init__(self,name,age,weight):
#实例属性
self.name = name
self.age = age #self.set_age(age)
self.weight = weight
#快捷键:props
@property #装饰器(语法糖)get_age = property(get_age)
def get_age(self):
return self.__age
@set_age.setter #只负责拦截写入操作
def set_age(self,value):
if 18<=value<=20:
self.__age=value
else:
raise ValueError("不要")
#类属性,property对象可以拦截对age的操作
age = property(get_age,set_age)
G1 = GirlFriend("小明",50,300)
#对象.属性 方法 对象自己 类
print(G1.age)