Python:类

太久没写Python的程序了类的内容忘记了,这里写下回忆一下

1 Python-类属性

类有一个特殊的方法叫做构造函数,用作定义实例对象的属性,其必须被命名为__init__()(注意其前后下划线都是两个),括号内参数数量没有限制,但是第一位必须是self其用于表示对象自身,其将属性的值绑定在实例对象上。

class CuteCat:
    def __init__(self):
        self.name = "Lambtom"

上述代码说明了对象name属性的值。

class CuteCat2:
    def __init__(self):
        name = "Lambtom"

若是上述写法,Python会觉得只是在给普通的name变量赋值,该值将不会成为对象的属性。

我们实例化对象:

cat1 = CuteCat()
#输出cat1的name属性
cat1.name
#输出:
'Lambton'

若是CuteCat2类:

cat1 = CuteCat2()
#输出cat1的name属性
cat1.name
#输出:
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Untitled-1.ipynb Cell 4 in <module>
      1 cat2 = CuteCat1()
----> 2 cat2.name

AttributeError: 'CuteCat1' object has no attribute 'name'

程序将会报错,该类中没有name这个属性。

更为灵活的编程,我们可以从参数获取name的值:

class CuteCat:
    def __init__(self, cat_name):
        self.name = cat_name

实例化对象:

cat = CuteCat("Jojo")
#输出:
'Jojo'

据此,你也可以添加更多的属性上去。

2 Python-类方法

在类中定义方法和定义普通的函数一样,只有两个差别,1.必须写在class中,2.第一个参数为self用于表示对象自身。

参数self可以让我们在方法里面去获取或修改和对象绑定的属性。

若猫咪叫唤的次数和年龄成正比则可以这样写:

class CuteCat:
    def __init__(self, cat_name, cat_age, cat_color):
        self.name = cat_name
        self.age = cat_age
        self.color = cat_color
    def speak(self):
        print("喵" * self.age)

调用方法:

cat1 = CuteCat("Jojo", 3, "橙色")
cat1.speak()
#输出:
喵喵喵

这里还有一问题,在方法中创建的属性别的方法是否可以使用。

实例:

class CuteCat:
    def __init__(self, cat_name, cat_age, cat_color):
        self.name = cat_name
        self.age = cat_age
        self.color = cat_color
    def speak(self):
        self.w_ = 1
        print(self.w_)
    def test(self):
        self.w_ += 1
        print(self.w_)

实例化对象:

cat1 = CuteCat("小明", 5, "blue")

实验:

在speak()方法前尝试调self.w_

cat1.test()
#输出:
AttributeError: 'CuteCat' object has no attribute 'w_'

可以看见,在我们调用speak()方法前,使用test()方法会告诉我们CuteCat类中不存在w_变量

在speak()方法后尝试调self.w_

cat1.speak()
#输出:
1
cat1.test()
#输出:
2

可以发现此时程序正常执行。

所以可以在方法中调用在其他方法中创建的self属性,但是需要我们先调用创建过属性的方法。而__init__()方法中定义的属性,在对象实例化的时候就已经被创建,可以直接进行访问。

3 练习

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

class Restaurant:
    def __init__(self, restaurant_name, cuisine_type):
        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):
        print("餐馆正在营业!")
R1 = Restaurant("玉芝兰","川菜")
R1.restaurant_name
#输出:
'玉芝兰'
R1.cuisine_type
#输出:
'川菜'
R1.describe_restaurant()
#输出:
餐馆名字:玉芝兰 类型:川菜
R1.open_restaurant()
#输出:
餐馆正在营业!

2:三家餐馆  根据为完成练习1而编写的类创建三个实例,并对每个 实例调用方法describe_restaurant() 。

R1 = Restaurant("玉芝兰","川菜")
R2 = Restaurant("粤江南","粤菜")
R3 = Restaurant("海底捞","火锅")
#输出:
餐馆名字:玉芝兰 类型:川菜
餐馆名字:粤江南 类型:粤菜
餐馆名字:海底捞 类型:火锅

3:用户  创建一个名为User 的类,其中包含属性first_name 和 last_name ,以及用户简介通常会存储的其他几个属性。在类User 中定义一 个名为describe_user() 的方法,用于打印用户信息摘要。再定义一个名为 greet_user() 的方法,用于向用户发出个性化的问候。 创建多个表示不同用户的实例,并对每个实例调用上述两个方法。

class User:
    def __init__(self, first_name, last_name, sex):
        self.first_name = first_name
        self.last_name = last_name
        self.sex = sex
    def describe_user(self):
        print("用户名:" + self.first_name + " " + "用户姓:" + self.last_name)
    def greet_user(self):
        if self.sex == "男":
            print("欢迎" + self.last_name + "先生")
        else:
            print("欢迎" + self.last_name + "女士")

U1 = User("小明", "王", "男")
U2 = User("小黑", "李", "女")

U1.describe_user()
U1.greet_user()
U2.describe_user()
U2.greet_user()
#输出:
用户名:小明 用户姓:王
欢迎王先生
用户名:小黑 用户姓:李
欢迎李女士

参考

posted @ 2023-01-12 11:54  TTS-S  阅读(99)  评论(1编辑  收藏  举报