类:是一个特殊的对象,class A:定义的类属于 类对象
类的实例:obj = A()属于 实例对象
实例属性:init定义实例属性
实例方法:(self),对象名.方法名
类属性:针对类对象定义的属性,访问类属性方法:类名.类属性/对象名.类属性
类方法:针对类对象定义的方法,内部可直接访问类属性和其他类方法;类名.方法名
静态方法:不需要访问实例属性、类属性,也不用调用实例方法、类方法
私有属性:对象不希望公开的属性,访问私有属性:对象名.类名._私有属性
私有方法:对象不希望公开的方法,访问私有方法(无法直接调用):对象名.类名._私有方法
self是类(Class)实例化对象,cls就是类(或子类)本身,取决于调用的是那个类
1.封装实例应用
需求:
房子(House) 有 户型、总面积 和 家具名称列表
新房子没有任何的家具
家具(HouseItem) 有 名字 和 占地面积,其中
席梦思(bed) 占地 4 平米
衣柜(chest) 占地 2 平米
餐桌(table) 占地 1.5 平米
将以上三件 家具 添加 到 房子 中
打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
class Game:
# 定义一个类属性
top_score = 0
def __init__(self, player_name):
"""
定义一个实例属性
:param player_name:
"""
self.player_name = player_name
@staticmethod
def show_help():
"""定义一个静态方法"""
print("游戏帮助信息")
@classmethod
def show_top_score(cls):
"""
定义一个类方法
:return:
"""
print("玩家最高分为{}".format(cls.top_score))
def start_game(self):
"""
定义一个实例方法
:return:
"""
print("{}开始游戏了~".format(self.player_name))
Game.top_score = 999
Game.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 = 0
def add_bullet(self, count):
# 填充子弹
self.bullet_count += count
def shoot(self):
if self.bullet_count <= 0:
print("没有子弹,等死吧。。。")
return
# 发射子弹
self.bullet_count -= 1
print("{}剩余子弹{}".format(self.model, self.bullet_count))
class Soldier:
def __init__(self, name):
self.name = name
self.gun = None
def fire(self):
if self.gun is None:
print("没有枪,不敢上")
return
print("冲啊...{}".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 = name
def game(self):
print("{}在街上溜达".format(self.name))
class XiaoTianDog(Dog):
def game(self):
print("{}在天上飞".format(self.name))
class Person:
def __init__(self, name):
self.name = name
def 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 = name
self.__age = 18
def __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 = name
print("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())