类的创建与使用(python)

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是圣诞树的那个)

谢谢大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值