Python入门学习
2022/12/30 连续创作第二天
类的创建与使用(python)
简要描述
类是创建一个通用的模板,后面可以根据已创建的类创建特定的实例
例:创建一个car类,后面可以根据car类写出Audi实例。Audi实例可以传入自己的实参,也可以调用car类定义的方法(类中的函数)
创建类
class 类:
方法_init_()
注意_init_()是一个特殊方法,这种命名是一种约定,每次创建新的实例时将会自动调用这个方法,如果没有两个下划线则不会自动调用这个方法
class Car: #class是定义类的关键字
"""一次模拟汽车的简单尝试"""
#三重双引号是类中的注释,可以在此写对类的简单描述
def __init__(self,name,speed,year):
"""初始化属性name speed year"""
self.name = name
self.speed = speed
self.year = year
def speed_up(self):
print(f"The speed is {self.speed}!")
def years(self):
print(f"The {self.name} is {self.year} years old!")
#调用类与其中的属性/方法
Audi = Car("Audi",128,2)
#调用属性
print(f"{Audi.name}'s speed is {Audi.speed}!"
#调用方法
Audi.speed_up()
可以根据需要一次创造出多个实例,从而减少编写重复的代码,这就是类的优势
使用类和实例
我们创建一个新的Hero类
class Hero:
def __init__(self,name,job,gender):
"""初始化名字,职业,性别"""
self.name = name
self.job = job
self.gender = gender
def intro(self):
"""介绍英雄的基本信息"""
print(f"The hero is {self.name},his/her job is {self.job}.")
给属性指定默认值
在__init__()方法中将某个值指定为默认值,每次创建实例时,该值为默认值
在如下代码中,将英雄的初始等级指定为1
class Hero:
"""创建一个王者荣耀的英雄基本信息"""
def __init__(self,name,job,gender):
"""初始化名字,职业,性别"""
self.name = name
self.job = job
self.gender = gender
self.rank = 1 #将等级初始化为1
def intro(self):
"""介绍英雄的基本信息"""
print(f"The hero is {self.name},his/her job is {self.job}.")
def print_rank(self):
"""输出该英雄的等级"""
print(f"The rank of the hero is {self.rank}")
修改属性的值
1.直接修改属性的值
Athena = Hero("Athena","worrier","female")
Athena.rank=2
Athena.print_rank()
2.通过方法修改属性的值
在原来的Hero类里添加一个提升等级的方法
def update_hero(self,new_rank):
"""英雄升级"""
self.rank=new_rank
#调用该方法为英雄升级
Athena.update_hero(5)
注意new_rank这个参数并不是在创建实例时就调用的,而是在调用undate_hero()方法才需要调用
3.通过方法对属性的值递增
事实上英雄总是逐级成长,所以我们可以将赋值方法改为递增方法
def up_rank(self,up)
"""英雄升级"""
self.rank += up
继承类
有的时候已经有了写好的类,那么可以在原有的类上做补充和修改。这将自动获得另一个类的所有属性与方法。原有的类称作父类,新的称作子类
创建子类
class Newhero(Hero):
def __init__(self,name,job,gender):
"""初始化父类的属性"""
super().__init__(name,job,gender)
Arthur.Newhero("Arthur","worrier","male")
Athena.print_rank()
1.创建子类时,父类必须包含在当前文件中,且在子类前面。在定义子类时用圆括号引用父类
2.super是一个特殊函数,是一个可以调用父类的方法
super().__init__(name,job,gender)
这一行代码初始化了父类原有的全部属性。
给子类定义属性与方法
例,给英雄添加一个获得时间(属性)与修改获得时间的方法
class Newhero(Hero):
def __init__(self,name,job,gender):
"""初始化父类的属性"""
super().__init__(name,job,gender)
self.time = "2022/9/1"
def update_time(self,date):
"""更新获得时间"""
self.time = date
print(f"The time you get the hero is {self.time}.")
Arthur = Newhero("Arthur","worrier","male")
Arthur.update_time("2022/12/30")
重写父类
如果父类中有不需要的方法,都可以进行重写,比如试用期的英雄无获得日期,可以将update_time重写
class Try_hero(Newhero):
def __init__(self,name,job,gender):
"""初始化父类的属性"""
super().__init__(name,job,gender)#注意该初始化同样初始化了time属性
def update_time(self,date):
print("你还没有获得这个英雄!")
将实例用作属性
创建一个描述英雄身高,体重…的类,然后引用这个类作为主要类的一部分
调用时
class Describe:
def __init__(self):
self.height = 1.9
def output(self,height):
print(f"The height is {self.height}.")
class Try_hero(Newhero):
def __init__(self,name,job,gender):
"""初始化父类的属性"""
super().__init__(name,job,gender)#注意该初始化同样初始化了time属性
self.des = Describe()#Describe类成了Try_hero的一个属性
def update_time(self,date):
print("你还没有获得这个英雄!")
Arthur = Try_hero("Arthur","worrier","male")
Arthur.des.output(1.9)
导入类
导入模块中的类与上一篇导入模块中的函数语法相同
假设之前创建的类都存在B.py中
1.导入其中的类,相互之间用","隔开
from B import Hero,Newhero,Try_hero,Describe
Athena = Hero("Athena","worrier","female")
Athena.update_hero(5)
Athena.print_rank()
Arthur = Try_hero("Arthur","worrier","male")
Arthur.des.output(1.9)
Arthur.update_time("2022/12/30")
2.导入B类然后用"B."调用其中的类
import B
Athena = B.Hero("Athena","worrier","female")
Athena.update_hero(5)
Athena.print_rank()
3.导入其中所有类(可能会遇到冲突)
from B import*
4.使用别名,类同函数(使用as关键字)
也可以在一个模块中导入另一个模块
导入python标准库
导入别人已经写好的标准模块,可以大大节省我们工作的时间(不要总是尝试着自己造轮子)
import time
def put():
name=["n","p","y"]
print(18*" ",end="")
for i in range(0,len(name)):
print(name[i],end="")
time.sleep(0.3)
print("")
for num in range(1,16):
print((20-num)*" ",(2*num-1)*"\033[33m*\033[0m")
time.sleep(0.1)
for num in range(1,10):
print("\033[32m ****** \033[0m")m"
这就是导入了标准time模块,可以节省自己写模块的大量时间
代码展示
B.py
class Hero:
"""创建一个王者荣耀的英雄基本信息"""
def __init__(self,name,job,gender):
"""初始化名字,职业,性别"""
self.name = name
self.job = job
self.gender = gender
self.rank = 1 #将等级初始化为1
def intro(self):
"""介绍英雄的基本信息"""
print(f"The hero is {self.name},his/her job is {self.job}.")
def print_rank(self):
"""输出该英雄的等级"""
print(f"The rank of the hero is {self.rank}")
def update_hero(self,new_rank):
"""英雄升级"""
self.rank=new_rank
class Newhero(Hero):
def __init__(self,name,job,gender):
"""初始化父类的属性"""
super().__init__(name,job,gender)
self.time = "2022/9/1"
def update_time(self,date):
"""更新获得时间"""
self.time = date
print(f"The time you get the hero is {self.time}.")
class Describe:
def __init__(self):
self.height = 1.9
def output(self,height):
print(f"The height is {self.height}.")
class Try_hero(Newhero):
def __init__(self,name,job,gender):
"""初始化父类的属性"""
super().__init__(name,job,gender)#注意该初始化同样初始化了time属性
self.des = Describe()#Describe类成了Try_hero的一个属性
def update_time(self,date):
print("你还没有获得这个英雄!")
C.py
#from B import Hero,Newhero,Try_hero,Describe
#Athena = Hero("Athena","worrier","female")
#Athena.update_hero(5)
#Athena.print_rank()
#Arthur = Try_hero("Arthur","worrier","male")
#Arthur.des.output(1.9)
#Arthur.update_time("2022/12/30")
import B
Athena = B.Hero("Athena","worrier","female")
Athena.update_hero(5)
Athena.print_rank()
(A.py是圣诞树的那个)
谢谢大家!