类:是一个特殊的对象,class A:定义的类属于 类对象

类的实例:obj = A()属于 实例对象

实例属性:init定义实例属性

实例方法:(self),对象名.方法名

类属性:针对类对象定义的属性,访问类属性方法:类名.类属性/对象名.类属性

类方法:针对类对象定义的方法,内部可直接访问类属性和其他类方法;类名.方法名

静态方法:不需要访问实例属性、类属性,也不用调用实例方法、类方法

私有属性:对象不希望公开的属性,访问私有属性:对象名.类名._私有属性

私有方法:对象不希望公开的方法,访问私有方法(无法直接调用):对象名.类名._私有方法

self是类(Class)实例化对象,cls就是类(或子类)本身,取决于调用的是那个类

1.封装实例应用

需求:
房子(House) 有 户型、总面积 和 家具名称列表
新房子没有任何的家具
家具(HouseItem) 有 名字 和 占地面积,其中
席梦思(bed) 占地 4 平米
衣柜(chest) 占地 2 平米
餐桌(table) 占地 1.5 平米
将以上三件 家具 添加 到 房子 中
打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表

  1. class Game:
  2. # 定义一个类属性
  3. top_score = 0
  4. def __init__(self, player_name):
  5. """
  6. 定义一个实例属性
  7. :param player_name:
  8. """
  9. self.player_name = player_name
  10. @staticmethod
  11. def show_help():
  12. """定义一个静态方法"""
  13. print("游戏帮助信息")
  14. @classmethod
  15. def show_top_score(cls):
  16. """
  17. 定义一个类方法
  18. :return:
  19. """
  20. print("玩家最高分为{}".format(cls.top_score))
  21. def start_game(self):
  22. """
  23. 定义一个实例方法
  24. :return:
  25. """
  26. print("{}开始游戏了~".format(self.player_name))
  27. Game.top_score = 999
  28. Game.show_help() # 类名.静态方法
  29. Game.show_top_score() # 类名.类方法
  30. game = Game("小明") # 创建对象,实例化
  31. game.start_game() # 对象名.方法名()--实例方法
  32. Game.show_top_score()
  33. ----------------------------------------
  34. #游戏帮助信息
  35. #玩家最高分为0
  36. #小明开始游戏了~
  37. #玩家最高分为999

需求:
士兵 许三多 有一把 AK47
士兵 可以 开火
枪 能够 发射 子弹
枪 装填 装填子弹 —— 增加子弹数量

  1. class Gun:
  2. def __init__(self, model):
  3. # 枪型号
  4. self.model = model
  5. # 子弹数量
  6. self.bullet_count = 0
  7. def add_bullet(self, count):
  8. # 填充子弹
  9. self.bullet_count += count
  10. def shoot(self):
  11. if self.bullet_count <= 0:
  12. print("没有子弹,等死吧。。。")
  13. return
  14. # 发射子弹
  15. self.bullet_count -= 1
  16. print("{}剩余子弹{}".format(self.model, self.bullet_count))
  17. class Soldier:
  18. def __init__(self, name):
  19. self.name = name
  20. self.gun = None
  21. def fire(self):
  22. if self.gun is None:
  23. print("没有枪,不敢上")
  24. return
  25. print("冲啊...{}".format(self.name))
  26. self.gun.add_bullet(30)
  27. self.gun.shoot()
  28. ak47 = Gun('ak47')
  29. soldier = Soldier("zaygee")
  30. soldier.gun = ak47 # 把枪分配给士兵
  31. soldier.fire()
  32. -------------------------
  33. #冲啊...zaygee
  34. #ak47剩余子弹29

2.继承与多态应用实例

需求:
1.在 Dog 类中封装方法 game
普通狗只是简单的玩耍
2.定义 XiaoTianDog 继承自 Dog,并且重写 game 方法
哮天犬需要在天上玩耍
3.定义 Person 类,并且封装一个 和狗玩 的方法
在方法内部,直接让 狗对象 调用 game 方法

  1. class Dog:
  2. def __init__(self, name):
  3. self.name = name
  4. def game(self):
  5. print("{}在街上溜达".format(self.name))
  6. class XiaoTianDog(Dog):
  7. def game(self):
  8. print("{}在天上飞".format(self.name))
  9. class Person:
  10. def __init__(self, name):
  11. self.name = name
  12. def play_with_dog(self, dog):
  13. print("{}和{}在快乐的玩耍".format(self.name, dog.name))
  14. dog.game()
  15. wangcai = XiaoTianDog("哮天犬") # 创建一个狗对象
  16. zaygee = Person("zaygee") # 创建一个人对象
  17. zaygee.play_with_dog(wangcai) # 人遛狗
  18. --------------------------
  19. #zaygee和哮天犬在快乐的玩耍
  20. #哮天犬在天上飞

3.私有属性&私有方法

  1. class Man:
  2. def __init__(self, name):
  3. self.name = name
  4. self.__age = 18
  5. def __secret(self):
  6. return "我的年龄是{}".format(self.__age)
  7. zaygee = Man("zaygee")
  8. print(zaygee.name)
  9. # 访问私有属性:对象名._类名.__私有属性
  10. print(zaygee._Man__age)
  11. # 访问私有方法(无法直接调用):对象名._类名.__私有方法
  12. print(zaygee._Man__secret())
  13. --------------------------
  14. #zaygee
  15. #18
  16. #我的年龄是18

4.super()方法

super函数是用于调用父类(超类)的一个方法
语法:

  1. super.xxx 或者 super(class, self).xxx
  1. class Base(object):
  2. def __init__(self):
  3. print("enter Base")
  4. print("leave Base")
  5. class A(Base):
  6. def __init__(self):
  7. print("enter A")
  8. # super(A, self).__init__() 首先找到A的父类Base,然后把类A的对象转化为类Base的对象
  9. super(A, self).__init__()
  10. print("leave A")
  11. class B(Base):
  12. def __init__(self):
  13. print("enter B")
  14. super(B, self).__init__()
  15. print("leave B")
  16. class C(A, B):
  17. def __init__(self, name):
  18. self.name = name
  19. print("enter C")
  20. super(C, self).__init__()
  21. print("leave C")
  22. def __str__(self):
  23. return "我叫{}".format(self.name)
  24. def __call__(self, *args, **kwargs):
  25. print("我是call方法")
  26. c = C('zaygee')
  27. print(c)
  28. c()
  29. -----------------------------------------
  30. #enter C
  31. #enter A
  32. #enter B
  33. #enter Base
  34. #leave Base
  35. #leave B
  36. #leave A
  37. #leave C
  38. #我叫zaygee
  39. #我是call方法

5.mro()方法

mro(): 遍历类的所有基类,并将它们按优先级从高到低排序

  1. # [<class 'Exception'>, <class 'BaseException'>, <class 'object'>]
  2. print(Exception.mro())