创建和使用类
1. 创建类
根据小狗创建dog类,每个实例都将存储名字和年龄,如何赋予了每条小狗“”吃“的能力”和“跑的能力”:
解析如下:
1.class Dog:在python中,首字母大写的名称指的是类,类定义没有圆括号;
2.注释部分为描述这个类的主要功能;
3. 特殊的方法_init_()定义为包含三个形参:self、name和age,每当根据Dog类创建新实例时,python都会运行,开头和末尾都需要有两个下划线。
4. self.name和self.name两个变量都有self,以self为前缀的变量可供类中的所有方法使用,像这样可通过实例访问的变量称为属性。
5. Dog还定了两个方法eat()和run(),这些方法的执行不需要额外的信息,因此只有一个形参sdle。
class Dog:
# 这是一个dog类
def __init__(self, name, age):
# 初始化属性name和age
self.name = name
self.age = age
def eat(self):
# 吃的方法
print(f"{self.name}吃东西....")
def run(self):
# 跑的方法
print(f"{self.name}跑起来....")
2. 根据类创建实例
2.1 访问属性
1.创建一条名为“pipi”,年龄6岁的小狗
2.my_dog.name:访问实例的属性,可使用句点表示法
my_dog = Dog('pipi', 6)
print(f"我的小狗叫{my_dog.name}")
print(f"它今年{my_dog.age}岁了。")
运行结果:
我的小狗叫pipi
它今年6岁了。
2.2 调用方法
根据Dog类创建好实例后,就可以使用句点表示法来调用Dog类中定义的方法了
my_dog.eat()
my_dog.run()
运行结果:
pipi吃东西....
pipi跑起来....
2.3 创建多个实例
这个类中创建了两个实例,分别名为“pipi”和“maomao”,每条小狗都是一个独立的实例,有自己的属性,能够执行相同的操作
my_dog = Dog('pipi', 6)
your_dog = Dog('maomao',3)
print(f"我的小狗叫{my_dog.name}")
print(f"它今年{my_dog.age}岁了。")
my_dog.eat()
print('\n') # 输出一个换行符,方便看结果
print(f"你的的小狗叫{your_dog.name}")
print(f"它今年{your_dog.age}岁了。")
your_dog.eat()
运行结果:
我的小狗叫pipi
它今年6岁了。
pipi吃东西....
你的的小狗叫maomao
它今年3岁了。
maomao吃东西...
注意:即使第二条小狗指定了同样的名字和年龄,python依然会根据Dog类创建另一个实例。
3. 使用类和实例
3.1 Phone类
编写一个手机Phone类,存储有关手机的信息,还有个汇总这些信息的方法
这里的Phone类,形参的值以及方法同上个Dog类的例子意思一样。
class Phone:
"""关于iphone的类"""
def __init__(self, brand, version, year):
"""初始化phone的属性"""
self.brand = brand
self.version = version
self.year = year
def get_descriptive_name(self):
"""返回整洁的描述"""
return f"{self.brand} {self.version} 年份:{self.year}"
my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())
运行结果:
iphone 12 年份:2020
3.2 给属性指定默认值
创建实例时,有些属性不需要通过形参来定义,可以在方法__init__()中为其指定默认值。
下面增加了一个服务时间的属性以及使用时间的方法
class Phone:
"""关于iphone的类"""
def __init__(self, brand, version, year):
"""初始化phone的属性"""
self.brand = brand
self.version = version
self.year = year
self.service_time = 0
def get_descriptive_name(self):
"""返回整洁的描述"""
return f"{self.brand} {self.version} 年份:{self.year}"
def dis_time(self):
"""显示手机使用时间"""
return f"该手机已经使用 {self.service_time}小时了 "
my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())
print(my_phone.dis_time())
运行后python会创建一个名为dis_time( )方法,并将其初始值设置默认的0
iphone 12 年份:2020
该手机已经使用 0小时了
3.3 修改属性的值
修改属性的方法有3种:直接通过实例进行修改,通过方法进行设置和通过方法进行递增(增加特定的值)
3.3.1 直接修改属性的值
my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())
my_phone.service_time = 100 #直接修改属性的值
print(my_phone.dis_time())
运行结果
iphone 12 年份:2020
该手机已经使用 100小时了
3.3.2 通过方法修改属性的值
修改类中使用使用的方法,给该方法增加一个参数 hour
def dis_time(self, hour):
"""显示手机使用时间"""
self.service_time = hour
return f"该手机已经使用 {self.service_time}小时了 "
my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())
print(my_phone.dis_time(200))
调用dis_time()方法时并提供实参200,结果如下:
iphone 12 年份:2020
该手机已经使用 200小时了
使用if判断用户后面调用dis_time( )方法给入的实参是否正常,因为使用时间应该是越来越长,不可回调。修改dis_time()的方法如下:
def dis_time(self, hour):
"""显示手机使用时间"""
if hour >= self.service_time:
self.service_time = hour
return f"该手机已经使用 {self.service_time}小时了 "
else:
return "不可以将时间往回调"
第二次调用传入的实参小于第一次的运行结果:
iphone 12 年份:2020
该手机已经使用 200小时了
不可以将时间往回调
3.3.3 通过方法对属性的值进行递增
有时候需要属性值递增特定的量,而不是将其设置为全新的值,假设第一次调后时使用时间是1000小时,然后后面调用都是增加的值,增加add_time( )方法如下:
def add_time(self, add_hour):
self.service_time+=add_hour
return f"该手机已经使用 {self.service_time}小时了 "
my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())
print(my_phone.dis_time(1000))
print(my_phone.add_time(100))
测试结果:
iphone 12 年份:2020
该手机已经使用 1000小时了
该手机已经使用 1100小时了