Python Learning-面向对象编程-类 一
![](https://img.haomeiwen.com/i5787343/915f854f80a3aca1.png)
通过一个例子来了解类
class Store():
"""模拟一个小商店"""
def __init__(self, store_name, store_type):
"""初始化属性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
def open_store(self):
"""开始营业"""
print(self.store_name, '开始营业')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已经打烊')
下面是本例的解读:
代码:
class Store():
"""模拟一个小商店"""
使用关键字class
来创建类,class
后面的Store
表示类名,约定类型开头字母要大写,类名后面要加上一对()
代码:
def __init__(self, store_name, store_type):
"""初始化属性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
__init__
是一种特殊的方法(构造方法),它的写法是init左右分别有两个下划线,该方法会在类被例化时被调用;方法其实就是函数,类中的函数一般叫作方法;实例化是指创建一个真正的可在计算机内存上运行的类的对象
这个方法中有三个形参,其中self
是必须的,而store_name
和store_type
是自定义的;self
必须位于所有形参位置的第一个;self
的作用是,当实例化一个类的对象时,会将该实例对象自动传入self
中
self.store_name
和self.store_type
中存储在类的实例中的两个属性(变量),分别表示商店名字与商店类型,在实例化的时候,通过传递给形参中的值来赋予这两个变量值,这种操作方式叫做属性的初始化——即给属性一个初始的值
代码:
def open_store(self):
"""开始营业"""
print(self.store_name, '开始营业')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已经打烊')
def open_store(self):
和def close_sotre(self):
分别是两个自定义的方法,分别用来表示商店开始营业与打烊;类中的方法必须有一个self
形参,通过self
来访问该类的实例
创建类的实例
class Store():
"""模拟一个小商店"""
def __init__(self, store_name, store_type):
"""初始化属性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
def open_store(self):
"""开始营业"""
print(self.store_name, '开始营业')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已经打烊')
# 实例化一个supermarket类型的超级商店
my_store = Store('超级商店', 'supermarket')
# 调用实例中的开始营业方法
my_store.open_store()
输出:
超级商店 开始营业
Store('超级商店', 'supermarket')
表示创建一个Store
的实例;其中需要两个参数,因为在实例化的时候,会调用构造方法__init__(self, store_name, store_type)
,self
是自动传入的,所以不需要做任何操作,这里需要传入的是商店名称与商店类型两个实参
这里,将实例赋值给变量my_sotre
,如果要访问实例中的属性和方法,可通过操作符.
来调用
通过类可以创建多个对象,避免了重复的代码
class Store():
"""模拟一个小商店"""
def __init__(self, store_name, store_type):
"""初始化属性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
def open_store(self):
"""开始营业"""
print(self.store_name, '开始营业')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已经打烊')
# 实例化一个supermarket类型的超级商店
my_store = Store('超级商店', 'supermarket')
# 调用实例中的开始营业方法
my_store.open_store()
# 创建一个百姓商店的小超市
baixing_store = Store('百姓商店', 'supermarket')
# 让百姓商店开始营业
baixing_store.open_store()
# 让百姓商店打烊
baixing_store.close_sotre()
# 打印百姓商店类型
print(baixing_store.store_type)
输出:
超级商店 开始营业
百姓商店 开始营业
百姓商店 已经打烊
supermarket
构造方法
__init__
方法用于初始化实例中的属性,如果没有需要初始化的自定义属性,__init__
方法可以省略,默认会创建一个构造方法,只是不显示而已,如下:
class Store():
"""模拟一个小商店"""
def open_store(self):
"""开始营业"""
print('开始营业')
def close_sotre(self):
"""商店打烊"""
print('已经打烊')
my_store = Store()
my_store.open_store()
输出:
开始营业
因为没有要初始化的属性,因此不需要传递任何实参(默认传递了类的实例到self
中),而类默认包含一个__init__(self):
构造函数
动手动脑
创建一个可以进货、出货的商店,用列表/字典来包含商品清单,出出售货品的时候,可以指定名称与数量,并且从货品清单里减去相应数量,如果数量等于0后提醒进货,进货的时候可以指定进货的商品与数量,并将货品清单里的数量增加相应数量
class Store():
"""模拟一个小商店"""
def __init__(self, store_name, store_type, commodity_list):
"""初始化属性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
self.commodity_list = commodity_list
def open_store(self):
"""开始营业"""
print(self.store_name, '开始营业')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已经打烊')
def sell(self, commodity, quantity):
"""进货"""
if commodity not in self.commodity_list.keys():
print('本商店没有'+commodity)
return
self.commodity_list[commodity] += quantity
print('商品'+commodity+'进货了'+str(quantity)+'件')
def stock(self, commodity, quantity):
"""售货"""
if commodity not in self.commodity_list.keys():
self.commodity_list[commodity] = quantity
print('新增商品'+commodity+str(quantity)+'件')
return
if self.commodity_list[commodity] >= quantity:
self.commodity_list[commodity] += quantity
print('商品'+commodity+'出售了'+str(quantity)+'件')
else:
print('商品'+commodity+'数量不足,无法出售,请忙进货')
# 定义一个商品清单,key是名称,value表示数量
commodity_list = {'apple':100, 'milk':210, 'towel':72, 'shower gel':55}
# 实例化一个叫商店叫美丽商店
my_store = Store('美丽商店', 'supermarket', commodity_list)
# 打印商品清单
print(my_store.commodity_list)
# 出售15个苹果
my_store.sell('apple',15)
# 打印商品清单
print(my_store.commodity_list)
# 出售10件牛奶
my_store.sell('milk',10)
# 打印商品清单
print(my_store.commodity_list)
# 出售10件西红柿
my_store.sell('tomato',10)
# 打印商品清单
print(my_store.commodity_list)
# 进化100件西红柿
my_store.stock('tomato',100)
# 打印商品清单
print(my_store.commodity_list)
输出:
{'apple': 100, 'milk': 210, 'towel': 72, 'shower gel': 55}
商品apple进货了15件
{'apple': 115, 'milk': 210, 'towel': 72, 'shower gel': 55}
商品milk进货了10件
{'apple': 115, 'milk': 220, 'towel': 72, 'shower gel': 55}
本商店没有tomato
{'apple': 115, 'milk': 220, 'towel': 72, 'shower gel': 55}
新增商品 tomato100件
{'apple': 115, 'milk': 220, 'towel': 72, 'shower gel': 55, ' tomato': 100}
上面的例子就中再解释了,有不明白的可以看前面的章节,或者给我留言
小红知道你打造了一个一级棒的商店,想请你帮助她打造一个食品小店,她愿意付给你一大笔酬劳
使用继承
想要为小红创建一个食品小店,初步想法一定是再建立一个类似于Store的新类,使用继承可以大大的简化工作量
当一个类A继承另一个类B时,类A将拥有类B中所有的属性与方法,B类叫做父类,A类叫做子类
class Store():
"""模拟一个小商店"""
def __init__(self, store_name, store_type, commodity_list):
"""初始化属性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
self.commodity_list = commodity_list
def open_store(self):
"""开始营业"""
print(self.store_name, '开始营业')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已经打烊')
def sell(self, commodity, quantity):
"""进货"""
if commodity not in self.commodity_list.keys():
print('本商店没有'+commodity)
return
self.commodity_list[commodity] += quantity
print('商品'+commodity+'进货了'+str(quantity)+'件')
def stock(self, commodity, quantity):
"""售货"""
if commodity not in self.commodity_list.keys():
self.commodity_list[commodity] = quantity
print('新增商品'+commodity+str(quantity)+'件')
return
if self.commodity_list[commodity] >= quantity:
self.commodity_list[commodity] += quantity
print('商品'+commodity+'出售了'+str(quantity)+'件')
else:
print('商品'+commodity+'数量不足,无法出售,请忙进货')
# ---------以上的原来的类-----------
class FoodStore(Store):
"""食品小店"""
def __init__(self, store_name, store_type, commodity_list):
"""初始化"""
# 调用父类中的构造方法,通过下面的代码让子类包含父类中的属性与方法
super().__init__(store_name, store_type, commodity_list)
# 定义一个商品清单
food_list = {'apple':100, 'milk':210, 'pear':72}
# 实例化一个叫商店叫美丽商店
food_store = FoodStore('美丽商店', 'supermarket', food_list)
# 打印商品清单
print(food_store.commodity_list)
# 出售5个苹果
food_store.sell('apple',5)
输出:
{'apple': 100, 'milk': 210, 'pear': 72}
商品apple进货了5件
将父类的名称写在子类名称后面的()
里,然后在构造方法中通过super()
来调用父类的构造方法,来初始化父类;父类又叫做超类,所以采用super
的时候会访问到Store
super().__init__(store_name, store_type, commodity_list)
也可以通过父类名来初始化父类,如Store.__init__(self, store_name, store_type, commodity_list)
,但是别忘记传递self
参数
虽然FoodStore
类中没有sell
方法,但food_store.sell('apple',5)
依然可以执行,说明子类是拥有父类中的方法与属性的