# 没有继承关系
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:UsersqingfPycharmProjectspythonProjectvenvscriptspython.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py 鸭子在草地飞行 天鹅在空中翱翔 飞机在云层滑翔 Process finished with exit code 0 C:UsersqingfPycharmProjectspythonProjectvenvscriptspython.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py 这是爷爷的钱 这是爷爷的钱 这是父亲的钱 这是爷爷的钱 这是父亲的钱 这是儿子的钱 Process finished with exit code 0
- 鸭子类型:一只鸟,能走路,能叫,能游泳, 但是不关注鸟本身,只关注走路,叫,游泳的这些方法
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:UsersqingfPycharmProjectspythonProjectvenvscriptspython.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py Traceback (most recent call last): File "C:UsersqingfPycharmProjectspythonProjectvenv第十四讲.py", line 66, inB.demo() TypeError: demo() missing 1 required positional argument: 'self' 这是demo方法 这是demo方法 Process finished with exit code 1
-
类方法
-
类方法需要使用装饰器@classmethod来装饰
-
类方法可以由实例对象和类对象来调用,不需要传递任何参数
class B(object):
@classmethod
def demo1(cls): #cls是默认参数,相当于当前的类对象
print('我才是真正的类方法')
b = B()
b.demo1()
B.demo1()
输出
C:UsersqingfPycharmProjectspythonProjectvenvscriptspython.exe C:/Users/qingf/PycharmProjects/pythonProject/venv/第十四讲.py 我才是真正的类方法 我才是真正的类方法 Process finished with exit code 0
-
静态方法
-
静态方法需要使用装饰器@staticmethod来装饰
class B(object):
@staticmethod
def demo2():
print('我是静态方法')
b = B()
b.demo2()
B.demo2()
11.3 单例模式
-
_new_()方法
-
_new_()方法用于创建与返回一个对象,在类准备将自身实例化时调用
class Demo(object):
def __init__(self):
print('__init__')
def __new__(cls):# 这里相当于重写了父类__new__方法,不在用于创建与返回一个对象
print('__new__')
return super().__new__(cls)
d = Demo()
输出
C:UsersqingfPycharmProjectspythonProjectvenvscriptspython.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()
test1()
- 需要自己掌握的一些模块:os, sys, time, random
-
多态
- 不关心对象类别,只关心对象的实例方法是否一致,一样的话,则可以使用一个接口调用不同的类的实例方法,展现出不同的形态
-
单例模式的创建(__new__方法)
class Single(object): count = None # 创建一个类属性,也可以称之为常量 def __new__(cls, *args, **kwargs): # 重写父类的__new__方法 if cls.count is None: #判断实例是否没有被创建 cls.count = super().__new__(cls) return cls.count else: return cls.count



