13.1 多态
class Duck(object):
def fly(self):
print('鸭子在草地飞行')
class Swan(object):
def fly(self):
print('天鹅在空中翱翔')
class Plane(object):
def fly(self):
print('飞机在云层滑翔')
def method(obj):
obj.fly()
duck = Duck()
method(duck)
swan = Swan()
method(swan)
plane = Plane()
method(plane)
class Grandpa(object):
def money(self):
print('这是爷爷的钱')
class Father(Grandpa):
def money(self):
super().money()
print('这是父亲的钱')
class Son(Father):
def money(self):
super().money()
print('这是儿子的钱')
def fun(obj):
obj.money()
grandpa = Grandpa()
father = Father()
son = Son()
fun(grandpa)
fun(father)
fun(son)
输出
C:\Users\qingf\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py
鸭子在草地飞行
天鹅在空中翱翔
飞机在云层滑翔
Process finished with exit code 0
C:\Users\qingf\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py
这是爷爷的钱
这是爷爷的钱
这是父亲的钱
这是爷爷的钱
这是父亲的钱
这是儿子的钱
Process finished with exit code 0
- 鸭子类型:一只鸟,能走路,能叫,能游泳, 但是不关注鸟本身,只关注走路,叫,游泳的这些方法
13.2 属性和方法总结
class A(object):
num = 0
a = A()
a.num = 10
print(A.num)
print(a.num)
-属性修改(类属性只能通过类对象来修改,不能通过实例对象来修改)
对象.属性名 = 属性值
- 实例方法
- 实例方法实例是可以直接调用的
- 类也可以调用实例方法,但是要传递一个实例对象作为参数
class B(object):
def demo(self):
print('这是demo方法')
b = B()
b.demo()
B.demo()
B.demo(b)
输出
C:\Users\qingf\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py
Traceback (most recent call last):
File "C:\Users\qingf\PycharmProjects\pythonProject\venv\第十四讲.py", line 66, in <module>
B.demo()
TypeError: demo() missing 1 required positional argument: 'self'
这是demo方法
这是demo方法
Process finished with exit code 1
class B(object):
@classmethod
def demo1(cls):
print('我才是真正的类方法')
b = B()
b.demo1()
B.demo1()
输出
C:\Users\qingf\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py
我才是真正的类方法
我才是真正的类方法
Process finished with exit code 0
class B(object):
@staticmethod
def demo2():
print('我是静态方法')
b = B()
b.demo2()
B.demo2()
11.3 单例模式
class Demo(object):
def __init__(self):
print('__init__')
def __new__(cls):
print('__new__')
return super().__new__(cls)
d = Demo()
输出
C:\Users\qingf\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py
__new__
__init__
Process finished with exit code 0
class Demo(object):
a = 1
def domo(self):
pass
d1 = Demo()
d1.demo()
d2 = Demo()
d2.demo()
- 单例模式是一种常用的软件设计模式,也就是说该类只包含一个实例
- 1.判断对象是否存在:不存在---->创建实例
- 2.如果存在,返回已经创建的实例
class Single(object):
obj = None
def __new__(cls):
if cls.obj is None:
cls.obj = super().__new__(cls)
return cls.obj
else:
return cls.obj
s1 = Single()
s2 = Single()
print(id(s1))
print(id(s2))
11.4 模块
-
模块化指将一个完整的程序分解成一个个小模块 -
通过将模块组合,来搭建出一个完成的程序 -
优点:
-
模块创建 -
同一模块不管导入多少次,只会执行一次
import test_mokuai
print(test_mokuai)
print(__name__)
if __name__ == '__main__':
test1()
- 需要自己掌握的一些模块:
os , sys , time , random
11.5 复习
-
多态
- 不关心对象类别,只关心对象的实例方法是否一致,一样的话,则可以使用一个接口调用不同的类的实例方法,展现出不同的形态
-
单例模式的创建(__new__ 方法) class Single(object):
count = None
def __new__(cls, *args, **kwargs):
if cls.count is None:
cls.count = super().__new__(cls)
return cls.count
else:
return cls.count
|