类:是一个特殊的对象,class A:定义的类属于 类对象
类的实例:obj = A()属于 实例对象
实例属性:init定义实例属性
实例方法:(self),对象名.方法名
类属性:针对类对象定义的属性,访问类属性方法:类名.类属性/对象名.类属性
类方法:针对类对象定义的方法,内部可直接访问类属性和其他类方法;类名.方法名
静态方法:不需要访问实例属性、类属性,也不用调用实例方法、类方法
私有属性:对象不希望公开的属性,访问私有属性:对象名.类名._私有属性
私有方法:对象不希望公开的方法,访问私有方法(无法直接调用):对象名.类名._私有方法
self是类(Class)实例化对象,cls就是类(或子类)本身,取决于调用的是那个类
1.封装实例应用
需求:
房子(House) 有 户型、总面积 和 家具名称列表
新房子没有任何的家具
家具(HouseItem) 有 名字 和 占地面积,其中
席梦思(bed) 占地 4 平米
衣柜(chest) 占地 2 平米
餐桌(table) 占地 1.5 平米
将以上三件 家具 添加 到 房子 中
打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
class Game:# 定义一个类属性top_score = 0def __init__(self, player_name):"""定义一个实例属性:param player_name:"""self.player_name = player_name@staticmethoddef show_help():"""定义一个静态方法"""print("游戏帮助信息")@classmethoddef show_top_score(cls):"""定义一个类方法:return:"""print("玩家最高分为{}".format(cls.top_score))def start_game(self):"""定义一个实例方法:return:"""print("{}开始游戏了~".format(self.player_name))Game.top_score = 999Game.show_help() # 类名.静态方法Game.show_top_score() # 类名.类方法game = Game("小明") # 创建对象,实例化game.start_game() # 对象名.方法名()--实例方法Game.show_top_score()----------------------------------------#游戏帮助信息#玩家最高分为0#小明开始游戏了~#玩家最高分为999
需求:
士兵 许三多 有一把 AK47
士兵 可以 开火
枪 能够 发射 子弹
枪 装填 装填子弹 —— 增加子弹数量
class Gun:def __init__(self, model):# 枪型号self.model = model# 子弹数量self.bullet_count = 0def add_bullet(self, count):# 填充子弹self.bullet_count += countdef shoot(self):if self.bullet_count <= 0:print("没有子弹,等死吧。。。")return# 发射子弹self.bullet_count -= 1print("{}剩余子弹{}".format(self.model, self.bullet_count))class Soldier:def __init__(self, name):self.name = nameself.gun = Nonedef fire(self):if self.gun is None:print("没有枪,不敢上")returnprint("冲啊...{}".format(self.name))self.gun.add_bullet(30)self.gun.shoot()ak47 = Gun('ak47')soldier = Soldier("zaygee")soldier.gun = ak47 # 把枪分配给士兵soldier.fire()-------------------------#冲啊...zaygee#ak47剩余子弹29
2.继承与多态应用实例
需求:
1.在 Dog 类中封装方法 game
普通狗只是简单的玩耍
2.定义 XiaoTianDog 继承自 Dog,并且重写 game 方法
哮天犬需要在天上玩耍
3.定义 Person 类,并且封装一个 和狗玩 的方法
在方法内部,直接让 狗对象 调用 game 方法
class Dog:def __init__(self, name):self.name = namedef game(self):print("{}在街上溜达".format(self.name))class XiaoTianDog(Dog):def game(self):print("{}在天上飞".format(self.name))class Person:def __init__(self, name):self.name = namedef play_with_dog(self, dog):print("{}和{}在快乐的玩耍".format(self.name, dog.name))dog.game()wangcai = XiaoTianDog("哮天犬") # 创建一个狗对象zaygee = Person("zaygee") # 创建一个人对象zaygee.play_with_dog(wangcai) # 人遛狗--------------------------#zaygee和哮天犬在快乐的玩耍#哮天犬在天上飞
3.私有属性&私有方法
class Man:def __init__(self, name):self.name = nameself.__age = 18def __secret(self):return "我的年龄是{}".format(self.__age)zaygee = Man("zaygee")print(zaygee.name)# 访问私有属性:对象名._类名.__私有属性print(zaygee._Man__age)# 访问私有方法(无法直接调用):对象名._类名.__私有方法print(zaygee._Man__secret())--------------------------#zaygee#18#我的年龄是18
4.super()方法
super函数是用于调用父类(超类)的一个方法
语法:
super.xxx 或者 super(class, self).xxx
class Base(object):def __init__(self):print("enter Base")print("leave Base")class A(Base):def __init__(self):print("enter A")# super(A, self).__init__() 首先找到A的父类Base,然后把类A的对象转化为类Base的对象super(A, self).__init__()print("leave A")class B(Base):def __init__(self):print("enter B")super(B, self).__init__()print("leave B")class C(A, B):def __init__(self, name):self.name = nameprint("enter C")super(C, self).__init__()print("leave C")def __str__(self):return "我叫{}".format(self.name)def __call__(self, *args, **kwargs):print("我是call方法")c = C('zaygee')print(c)c()-----------------------------------------#enter C#enter A#enter B#enter Base#leave Base#leave B#leave A#leave C#我叫zaygee#我是call方法
5.mro()方法
mro(): 遍历类的所有基类,并将它们按优先级从高到低排序
# [<class 'Exception'>, <class 'BaseException'>, <class 'object'>]print(Exception.mro())
