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()
#输出:
用户名:小明 用户姓:王
欢迎王先生
用户名:小黑 用户姓:李
欢迎李女士
参考
-
Python编程:从入门到实践(第2版)