类与对象

21 阅读3分钟

一、类的定义和使用

要点

  1. 使用 class 关键字声明类
  2. 在属性或方法前加__,表示私有属性或方法,外部无法直接访问
  3. 类内部定义的方法,参数中必须有self

### 定义一个类
class Player:
    HP=100
    MP=100
    Lv=1
    Altack=20
    __Name="Hero"  # 在属性或方法前加__,表示私有属性或方法,外部无法直接访问

    # 构造函数/初始化函数
    def __init__(self,hp,mp,lv,altack,name):
        self.HP=hp
        self.MP=mp
        self.Lv=lv
        self.Altack=altack

    # 方法/函数 类内部定义的方法,参数中必须有self
    def changeLv(self,tar):
        self.Lv=tar

    # 重写__str__方法,返回对象的字符串表示
    def __str__(self):
        return "\n名称:"+self.__Name+", \n生命值:"+str(self.HP)+", \n魔法值:"+str(self.MP)+", \n等级:"+str(self.Lv)+", \n攻击力:"+str(self.Altack)

### 创建一个对象
playerOne=Player(101,101,2,25,"张三")
playerOne.Name="张三"

### 访问对象的属性
print(playerOne.HP)
print(playerOne.MP)
print(playerOne.Lv)
print(playerOne.Altack)

### 使用方法
playerOne.changeLv(5)
print("等级:",playerOne.Lv)
print("详情:",playerOne.__str__())

二、 类的继承

要点

  1. 在声明类时,参数中填写父类表示继承
  2. 允许多继承,用,进行分隔
  3. 当父类中有同名方法时,默认调用第一个父类的方法
class Player:
    HP=100
    MP=100
    Lv=1
    Altack=20
    Name="Hero"  

    # 构造函数/初始化函数
    def __init__(self,name):
        self.Name=name

    # 方法/函数 类内部定义的方法,参数中必须有self
    def changeLv(self,tar):
        self.Lv=tar

    # 重写__str__方法,返回对象的字符串表示
    def __str__(self):
        return "\n名称:"+self.Name+", \n生命值:"+str(self.HP)+", \n魔法值:"+str(self.MP)+", \n等级:"+str(self.Lv)+", \n攻击力:"+str(self.Altack)
    
class Position:
    x=0
    y=0

    def changeLv(self,tar,info):
        self.Lv=tar

### 类的继承
class Player_FS(Player):
    skill="暴风雪"

    def __init__(self,name):
        self.Name=name
        self.HP=200
        self.MP=150
    
    def __str__(self):
        return "\n名称:"+self.Name+", \n技能:"+self.skill+", \n生命值:"+str(self.HP)+", \n魔法值:"+str(self.MP)

playerOne=Player_FS("李四")
# print("详情:",playerOne.__str__())

### 类的多继承
class Player_FS_MP(Position,Player):
    def __init__(self,name):
        super().__init__(name)
        self.x=10
        self.y=20
    
    def __str__(self):
        return "\n名称:"+self.Name+", \n生命值:"+str(self.HP)+", \n魔法值:"+str(self.MP)+"\n等级"+str(self.Lv)+", \n坐标:("+str(self.x)+","+str(self.y)+")"
    
### 当父类中有同名方法时,默认调用第一个父类的方法
playerTwo=Player_FS_MP("王五")
playerTwo.changeLv(10,"info")
print("详情:",playerTwo.__str__())

### 类的pass 抽象类/接口
class Player_ZS(Player,Position):
    pass

class Player():
    def move():
        pass
    def attack():
        pass

三、类的复写

要点

  1. 子类可以复写父类方法
  2. 当父类中有同名方法时,super()默认调用第一个父类的方法
  3. 也可指定使用父类方法:Position.changeLv(self,tar,"战士")
  4. python允许复写系统函数

class Player:
    HP=100
    MP=100
    Lv=1
    Altack=20
    Name="Hero"  

    # 构造函数/初始化函数
    def __init__(self,name):
        self.Name=name

    # 方法/函数 类内部定义的方法,参数中必须有self
    def changeLv(self,tar):
        self.Lv=tar

    # 重写__str__方法,返回对象的字符串表示
    def __str__(self):
        return "\n名称:"+self.Name+", \n生命值:"+str(self.HP)+", \n魔法值:"+str(self.MP)+", \n等级:"+str(self.Lv)+", \n攻击力:"+str(self.Altack)
    
class Position:
    x=0
    y=0

    
    def changeLv(self,tar,info):
        self.Lv=tar

### 子类可以复写父类方法
class Player_ZS(Player,Position):
    
    def changeLv(self, tar):
        print(f"战士{self.Name}升级了")
        ### 默认使用父类
        super().changeLv(tar)
        ### 也可以指定使用Position类
        Position.changeLv(self,tar,"战士")
        print(super().x)

playerOne=Player_ZS("张三")
playerOne.changeLv(2)


### python允许复写系统函数
def print(str):
    pass

print("hello world")

四、 类型注解

要点

  1. Python 不会强制变量类型,注解仅作为提示(运行时忽略)
from typing import Union

### 注解只是注解,并不像java锁定类型

### python类型注解 , 两种方法等效
age:int=18
age=18 #type:int
print(type(age))


myList:list[int,str]=[1,'hello']

### 对函数和返回值进行注解
def add(a:int,b:int)->int:
    return a+b


### 联合注解
myList:list[Union[int,bool]]=[1,True,False,2,4]  # 数据类型不是int就是bool

五、类的多态



class Player:
    def skill(self):
        print("释放技能")


class Player_FS(Player):
    def skill(self):
        print("释放暴风雪")

class Player_ZS(Player):
    def skill(self):
        print("释放旋风斩")


def useSkill(tarPlayer:Player):
    print("useSkill")
    tarPlayer.skill()

Player1 = Player_FS()
Player2 = Player_ZS()

### 多态测试 ###
useSkill(Player1)
useSkill(Player2)