寒假自学(七)
希望所有温柔又可爱的人最后都能幸福❤
今日总结:
代码量 | 200行 |
---|---|
博客量 | 一篇 |
所学时间 | 4小时左右 |
了解到的知识点 | python面向对象多态、单例设计模式 |
明日计划:
早上 | python模块 |
---|---|
下午 | python抛出异常 |
晚上 | 无 |
具体内容:
多态
多态不同的子类对象调用的父类方法,产生不同的执行结果
- 多态可以增加代码的灵活度
- 以继承和重写父类方法为前提
- 是调用方法的技巧,不会影响到类的内部设计
class Dog(object):
def __init__(self, name):
self.name = name
def game(self):
print("%s 蹦蹦跳跳的玩耍..." % self.name)
class XiaoSongYue(Dog):
def game(self):
print("%s 飞到天上去玩耍..." % self.name)
class Person(object):
def __init__(self, name):
self.name = name
def game_with_Dog(self, dog):
print("%s 和 %s 快乐的玩耍..." % (self.name, dog.name))
dog.game()
# xsy = Dog("肖松月")
xsy = XiaoSongYue("肖松月")
pyf = Person("蒲煜凡")
pyf.game_with_Dog(xsy)
实例
在初始化方法中定义对象属性,创建对象后,内存中就有了一个对象的实实在在的存在--实例
- 在程序运行时,类同样会被加载到内存
- 在
python
中,类是一个特殊的对象--类对象 - 在程序运行时,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例
- 除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法
类属性和实例属性
- 类属性就是给类对象中定义的属性
- 通常用来记录与这个类相关的特征
- 类属性不会用于记录具体对象的特征
class Tool(object):
# 类属性
count = 0
def __init__(self, name):
self.name = name
Tool.count += 1
tool1 = Tool("斧头")
tool2 = Tool("榔头")
too3 = Tool("水桶")
print(Tool.count)
属性获取机制
在python
中属性的获取存在一个向上查找机制
-
用过类名.类属性获取类属性
-
不推荐采用对象.类属性
print("工具对象总数是 %d" %tool3.count)
类方法
- 在类方法内部可以直接访问类属性或者调用其他的类方法
在方法内部通过cls.
来访问类的属性或调用其他的类方法
class Tool(object):
count = 0
@classmethod
def show_tool_count(cls):
print("工具对象的数量 %d" % cls.count)
def __init__(self, name):
self.name = name
Tool.count += 1
tool1 = Tool("斧头")
tool2 = Tool("榔头")
Tool.show_tool_count()
静态方法
既不需要访问实例属性或者调用实例方法也不需要访问类属性或者调用类方法时可以使用静态方法
class Dog(object):
@staticmethod
def run():
print("小狗要跑...")
综合演练:
class Game(object):
# 历史最高分
top_score = 0
def __init__(self, player_name):
self.player_name = player_name
@staticmethod
def show_help():
print("帮助信息:让僵尸进入大门")
@classmethod
def show_top_score(cls):
print("历史记录 %d" % cls.top_score)
def start_game(self):
print("%s 开始游戏啦..." % self.player_name)
Game.show_help()
Game.show_top_score()
xsy = Game("肖松月")
xsy.start_game()
单列设计模式
-
目的--让类创建的对象,在系统中只有唯一的一个实例
-
每一次执行
类名()
返回的对象,内存地址是相同的 -
使用
类名()
创建对象时,python
的解释器首先会调用__new__
方法为对象分配空间
重写__new__
方法一定要return super().__new__(cls)
class MusicPlayer(object):
# *args:多值元组参数
# ** kwargs:多值字典参数
def __new__(cls, *args, **kwargs):
# 创建对象时,new方法会被自动调用
print("创建对象,分配空间")
# 调用父类方法
return super().__new__(cls)
def __init__(self):
print("播放器初始化")
player = MusicPlayer()
print(player)
希望让初始化动作只被执行一次
class MusicPlayer(object):
instance = None
init_flag = False
# *args:多值元组参数
# ** kwargs:多值字典参数
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
if not MusicPlayer.init_flag:
print("初始化播放器")
MusicPlayer.init_flag = True
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)