Python Learning-面向对象编程-类 一


通过一个例子来了解类

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_namestore_type是自定义的;self必须位于所有形参位置的第一个;self的作用是,当实例化一个类的对象时,会将该实例对象自动传入self

self.store_nameself.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)依然可以执行,说明子类是拥有父类中的方法与属性的

目录
上一章 Python Learning-函数 二

猜你喜欢

转载自blog.csdn.net/weixin_38486884/article/details/82147874