python中类(class)的基础定义和属性以及一些简单实用的应用

面向对象

# 定义一个类
class Cat():  # 类的命名按大驼峰命名规范,即每个单词的首字母大写(语法上并无逻辑要求)
    def __init__(self,name,weight):  # 初始化,为内建组件,但是我们可以对其参数进行设定
        self.name = name  # 在此添加的参数是类的对象的初始值,所有在init函数中定义个变量
      # 都需要在创建对象时传递对应的值(或者在init中设定默认值,同一般函数类似)
        self.weight = weight
    def action(self):  # self 为类中的通用变量
        # 是所有类定义为Cat的对象的一个泛指,谁用他谁就是他
        print('会跳,会跑 会抓老鼠')
    def food(self):
        print('吃小鱼干,吃老鼠')

# 定义为类中的对象
tom = Cat('罗小黑',5)  # 类名称括号中的值即为要传递给init的参数
#  然后就能使用类的特性
tom.action()  # 因为tom定义为类Cat中的一个对象
# 所以tom具有Cat的性质,可以调用Cat中的参数和方法(函数)
tom.food()
#######################################################
# 简单的参数引用
class Human():
    DNA = 23  # 类中的公用参数,无其他赋值的对象使用这一参数均调用这一个数值
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def show(self):
        # 引用对象参数时,self.参数表示类中给对象使用的参数
        print('我的名字是{}\n今年{}岁有{}对DNA'.format(self.name,self.age,Human.DNA))

zs = Human('张三',25)
zs.show()
#################################################################################
__str__方法
class Num():
    def __init__(self,name,num):
        self.name = name
        self.num = num
    def __str__(self):
        print('wowow')
        return '数字是{}是第{}个'.format(self.name,self.num)

num = Num('一',1)
print(num,type(num))  # wowow \n 数字是一是第1个  <class '__main__.Num'>
## 此处打印出了显示为字符串的结果,但是num的类型不是str 而是定义的类Num中的__main__
# 运行的结果中还出现了wowow的输出,表明print语句调用了__str__方法中的所有内容。
# 实际上在对类中的对象进行print时,如果类中有定义__str__方法,print会默认(暗中)调用
###########################################################################################
# 烤肉
class Cook():
    def __init__(self,name,time):
        self.name = name
        self.time = time
        self.status = '生的'
    def cook(self):
        if self.time < 2:
             self.status ='生的'
        elif self.time < 4:
             self.status ='半生的'
        elif self.time < 6:
             self.status ='熟了'
        else:
             self.status ='烤焦了'
    def __str__(self):
        return '{}烤了{}个小时,现在是{}'.format(self.name,self.time,self.status)

yr = Cook('羊肉',4)
yr.cook()  #  如果要改变参数(默认初始值),需要调用对应的方法
print(yr)  # 羊肉烤了4个小时,现在是熟了
###################################################################################

类属性,对象属性(参数)

1 .不可变类型参数

class A():
    key = 10
    def __init__(self,num):
        self.num = num
    def cj(self):
        return A.key*self.num
a = A(100)
b = A(23)
print(b.cj()) # 230
print(a.cj()) # 1000
a.key = 3
print(a.cj()) # 300
print(b.cj()) # 230
print(A.key)  # 10
A.key = 5
print(a.cj()) # 500
print(b.cj()) # 115
print(A.key)  # 5
# 总结: 外部可以更改对象的属性,若对对象的不可变属性更改,
# 不影响类属性,如果更改类属性,将影响全部对象的属性
2,可变类型属性
class A():
    list = []
    def __init__(self,name):
        self.name = name
    def l(self):
        return self.list

a = A('小a')
b = A('小b')
print(a.l(),id(a.list))  #1794696
print(b.l())
print(A.list)
a.list = [1,2,3]
print(a.l(),id(a.list))  #1794760 发生改变
print(b.l())
print(A.list)
b.list.append('abcd')
print(a.l())  # [1, 2, 3] 由于对a.list重新赋值 ,相当于新建一个a.list供a专用
print(b.l(),id(b.list))  # ['abcd'] 1794696
print(A.list,id(A.list))  # ['abcd'] 1794696由于b在初始值得内存
#                           位置做出修改,导致类中整体参数被污染
delattr(a,'list') # 删除a的list属性可以使a重新使用类A的初始值
print(a.l(),id(a.list)) #  1794696
##############################################################################

应用实例

1. 游戏战斗

class Player1():
    def __init__(self,name,Hp,attack):
        self.name = name
        self.Hp = Hp
        self.attack = attack
    def fight(self,enemy):
        self.Hp -= enemy.attack
    def __str__(self):
        return '{}攻击力{}生命值{}'.format(self.name,self.attack,self.Hp)
class Player2():
    def __init__(self,name,Hp,attack):
        self.name = name
        self.Hp = Hp
        self.attack = attack
    def fight(self,enemy):
        self.Hp -= enemy.attack
    def __str__(self):
        return '{}攻击力{}剩余生命值{}'.format(self.name,self.attack,self.Hp)
a = Player1('赵云',30,100)
b = Player2('诸葛亮',100,20)
a.fight(b)
b.fight(a)
print(a)
print(b)
##################################################################################

两个类配合使用练习

"""
需求
狙击手 麦克 有一把 狙M99
麦克 可以 开火
狙M99 能够 发射 子弹
狙M99 装填 装填子弹 —— 增加子弹数量

"""
class Shooter():
    def __init__(self,name,gun = 'M99'):
        self.name = name
        self.gun = gun
        # self.ammo = ammo
    def fire(self,gun,time):
        for i in range(time):
            gun.fire()
            if gun.ammo == 0:
                break
        print('{}使用{}开火{}次'.format(self.name,gun.name,i+1))

class Guns():
    def __init__(self,name,ammo):
        self.name = name
        self.ammo = ammo
    def fire(self,):
        if self.ammo>0:
            self.ammo -= 1
        else:
            print('没有子弹了')
    def charge(self):
        print('填充弹药')
        self.ammo = 12
    def __str__(self):
        return '{}还剩{}颗子弹'.format(self.name,self.ammo)

pe = Shooter('麦克')
gun = Guns('M99',12)
pe.fire(gun,18)
# gun.charge()
print(gun)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值