本文标题:类

本文链接:http://7r4ck3r.top/index.php/archives/12/

除非另有说明,本作品遵循CC 4.0 BY-SA 版权协议

声明:转载请注明文章来源。

在 Python 中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

定义类

class JJJ()
    statement1
    statement2
    statement3

在类中,可以写任何python语句

创建类

方法__init__()
接下来我将以一个例子来说明

"""餐馆:创建一个名为 Restaurant 的类,其方法__init__()设置两个属性:
restaurant_name 和 cuisine_type。创建一个名为 describe_restaurant()的方法和一个
名为 open_restaurant()的方法,其中前者打印前述两项信息,而后者打印一条消息,
指出餐馆正在营业。
根据这个类创建一个名为 restaurant 的实例,分别打印其两个属性,再调用前述
两个方法。"""

 class Restaurant():    #1.定义了一个名为Restaurant的类
    def __init__(self, restaurant_name, cuisine_type): #2. __init()__方法创建了类,
         self.restaurant_name = restaurant_name
         self.cuisine_type = cuisine_type

     def describe_restaurant(self):
         """其中前者打印前述两项信息"""
         print(self.restaurant_name, self.cuisine_type)

     def open_restaurant(self):
         return "餐馆正在营业"

my_restaurant = Restaurant('jkjk','s')


print("我的餐馆的名字是" + my_restaurant.restaurant_name)
print("cuisine type : " +my_restaurant.cuisine_type)
print("餐馆状态:" + my_restaurant.open_restaurant())

在2处,init__() 是一个特殊方法,每当我们根据Restaurant类创建新实例时,python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,是为了避免python默认方法与普通方法发生名称冲突。我们定义的方法__init__() 包含三个形参:self、restaurant_name 、cuisine_type。在这个方法的定义中,形参self必不可少,而且必须位于其他形参的前面,self是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
self.restaurant_name = restaurant_name 获取与形参restaurant_name相关联的值,并将其赋给变量restaurant_name,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量称为属性。
除此之外还根据题目要求,创建一个名为 describe_restaurant()的方法和一个名为 open_restaurant()的方法

根据类创建实例

根据上面的代码

class Restaurant():
    --snip-- #意思是将上面我们定义的类复制过来(手动复制)

my_restaurant = Restaurant('jkjk','s') #3.

3.处,用__init()__方法创建了一个表示Restaurant的实例,并用提供的值设置了restaurant_name 和 cuisine_type,python返回了Restaurant的实例,并且储存给了变量my_restaurant
在这里,命名约定很有用:我们通常可以认为首字母大写的名称(如Restaurant)指的是类,而小写的名称(my_restaurant)指的是根据类创建的实例。

访问属性

my_restaurant.restaurant_name 句点表示法在Python中很常用,这种语法演示了Python如何获悉属性的值.在Dog类中引用这个属性时,使用的是self.restaurant_name

调用方法

my.restaurant.open_restaurant()

此就是调用方法,可指定实例的名称(这里是my_restaurant)和要调用的方法,并用句点分隔它们。例子中加了返回值,且返回为
"餐馆正在营业",在打印时,可以搭配print输出。

使用类和实例

将对上一个代码进行修改

"""在为完成练习 9-1 而编写的程序中,添加一个名为 number_served
的属性,并将其默认值设置为 0。根据这个类创建一个名为 restaurant 的实例;打印有
多少人在这家餐馆就餐过,然后修改这个值并再次打印它。
添加一个名为 set_number_served()的方法,它让你能够设置就餐人数。调用这个
方法并向它传递一个值,然后再次打印这个值。
添加一个名为 increment_number_served()的方法,它让你能够将就餐人数递增。
调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数。"""


class Restaurant:
    def __init__(self, restaurant_name, cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
        self.number_served = 0

    def person(self):
        """打印有多少人在这家餐馆就餐过"""
        print(self.restaurant_name + " 餐厅有 " + str(self.number_served) + " 人吃过")

    def describe_restaurant(self):
        """打印餐馆名称和菜系类型"""
        print("餐馆名称: " + self.restaurant_name)
        print("菜系类型: " + self.cuisine_type)

    def open_restaurant(self):
        return "餐馆正在营业"

    def set_number_served(self, number1):
        self.number_served = number1

    def increment_number_served(self, number2):
        self.number_served += number2


# 创建一个名为 restaurant 的实例
my_restaurant = Restaurant('jkjk', 's')

# 调用 person 方法
my_restaurant.person()

# 设置 number_served 属性并调用 person 方法
my_restaurant.number_served = 20
my_restaurant.person()

# 使用 set_number_served 方法设置 number_served 属性并调用 person 方法
my_restaurant.set_number_served(10)
my_restaurant.person()

# 使用 increment_number_served 方法增加 number_served 属性并调用 person 方法
my_restaurant.set_number_served(20)
my_restaurant.increment_number_served(100)
my_restaurant.person()


# 打印餐馆的名称和菜系类型
print("我的餐馆的名字是 " + my_restaurant.restaurant_name)
print("Cuisine type: " + my_restaurant.cuisine_type)

# 打印餐馆状态
print("餐馆状态:" + my_restaurant.open_restaurant())



输出:
jkjk 餐厅有 0 人吃过
jkjk 餐厅有 20 人吃过
jkjk 餐厅有 10 人吃过
jkjk 餐厅有 120 人吃过
我的餐馆的名字是 jkjk
Cuisine type: s
餐馆状态:餐馆正在营业

这段代码定义了一个名为Restaurant的类,并且添加一个名为 number_served的属性,并将其默认值设置为 0,定义了两个额外的方法

给指定属性默认值

  self.number_served = 0 #在代码中,我们将其默认值设置为0

当然我们也可以将默认值设置为其他的

修改属性的值

有三种方法
1 直接通过实例进行修改

self.number_served = 23

2 通过方法进行设置

def set_number_served(self, number1):
        self.number_served = number1
my_restaurant.set_number_served(10)

3 通过方法进行递增(增加特定的值)


    def increment_number_served(self, number2):
        self.number_served += number2
my_restaurant.set_number_served(20)
my_restaurant.increment_number_served(100)

print:120

继承

编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用
继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,
而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法

以一个代码来讲解

"""冰淇淋小店:冰淇淋小店是一种特殊的餐馆。编写一个名为 IceCreamStand 的
类,让它继承你为完成练习 9-1 或练习 9-4 而编写的 Restaurant 类。这两个版本的
Restaurant 类都可以,挑选你更喜欢的那个即可。添加一个名为 flavors 的属性,用于
存储一个由各种口味的冰淇淋组成的列表。编写一个显示这些冰淇淋的方法。创建一个
IceCreamStand 实例,并调用这个方法"""

class Restaurant():
    def __init__(self, restaurant_name, cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
        self.number_served = 0

    def person(self):
        """打印有多少人在这家餐馆就餐过"""
        print(self.restaurant_name + "餐厅有" + str(self.number_served) + "人吃过")

    def set_number_served(self, number1):
        self.number_served = number1

    def increment_number_served(self, number2):
        self.number_served += number2


class IceCreamStand(Restaurant):
    def __init__(self, restaurant_name, cuisine_type):
        super().__init__(restaurant_name, cuisine_type)
        self.flavors = ['chocolate','wine', 'banana'] #根据题目创建一个储存冰淇淋口味的列表

    def print_flavors(self): 
        for flavor in self.flavors:
            print(flavor)   #定义一个方法,用于输出列表里的冰淇淋口味



my_restaurant = IceCreamStand("jkjk's icecream","ssss")

my_restaurant.print_flavors()

my_restaurant.set_number_served(20)
my_restaurant.increment_number_served(100)
my_restaurant.person()

输出
chocolate
wine
banana
jkjk's icecream餐厅有120人吃过

在此我们定义了一个名为IceCreamStand的子类,。定义子类时,必须在括号内指定父类的名称。方法__init__()接受创建Restaurant实例所需的信息。
super()是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用IceCreamStand的父类的方法__init__(),让IceCreamStand实例包含父类的所有属性。父类也称为超类(superclass),名称super因此而得名

导入类

随着你不断地给类添加功能,文件可能变得很长,即便你妥善地使用了继承亦如此。为遵循Python的总体理念,应让文件尽可能整洁。为在这方面提供帮助,Python允许你将类存储在模块中,然后在主程序中导入所需的模块。

导入单个类

将上面的代码命名为restaurant的py文件——restaurant.py,我们创建了另外一个py文件——my_Restaurant.py,并在其中导入Restaurant类

from restaurant import Restaurant

的import语句让Python打开模块restaurant,并导入其中的Restaurant类。这样我们就可以使用Restaurant类了,
就像它是在这个文件中定义的一样

如果我们需要用到IceCreamStand这个类

from restaurant import IceCreamStand

从一个模块中导入多个类

from restaurant import Restaurant,IceCreamStand

从一个模块中导入多个类时,用逗号分隔了各个类。导入必要的类后,就可根据需要
创建每个类的任意数量的实例。

导入整个模块

import restaurant

导入模块中的所有类

from module_name import * 
最后修改:2024 年 07 月 21 日
如果觉得我的文章对你有用,请随意赞赏