根据小狗创建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}跑起来....")
1.创建一条名为“pipi”,年龄6岁的小狗
2.my_dog.name:访问实例的属性,可使用句点表示法
my_dog = Dog('pipi', 6) print(f"我的小狗叫{my_dog.name}") print(f"它今年{my_dog.age}岁了。")
运行结果:
我的小狗叫pipi 它今年6岁了。
根据Dog类创建好实例后,就可以使用句点表示法来调用Dog类中定义的方法了
my_dog.eat() my_dog.run()
运行结果:
pipi吃东西.... pipi跑起来....
这个类中创建了两个实例,分别名为“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类创建另一个实例。
编写一个手机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
创建实例时,有些属性不需要通过形参来定义,可以在方法__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种:直接通过实例进行修改,通过方法进行设置和通过方法进行递增(增加特定的值)
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小时了
修改类中使用使用的方法,给该方法增加一个参数 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小时了 不可以将时间往回调
有时候需要属性值递增特定的量,而不是将其设置为全新的值,假设第一次调后时使用时间是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小时了