多态性指的是同一种事物有多种形态
例如:动物这种事物有多种形态,如人/狗/猪
特性:我们可以在不考虑某一个对象具体类型的前提下,直接使用该对象
父类有的功能,子类一定有
多态性的好处在于增强了程序的灵活性和可扩展性
import abc
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod # 该装饰器限制子类必须定义有一个名为speak的方法
def speak(self): # 抽象方法中无需实现具体的功能
pass
@abc.abstractmethod
def run(self):
pass
# Animal() #Animal的作用是用来制定标准的
class People(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准
def speak(self):
print('啊啊啊')
def run(self):
print('咻咻咻')
class Dog(Animal):
def speak(self):
print('汪汪汪')
def run(self):
print('嗖嗖嗖')
class Pig(Animal):
def speak(self):
print('哼哼哼')
def run(self):
print('咣咣咣')
peo1 = People() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化
d1 = Dog()
p1 = Pig()
# peo1.speak() # 啊啊啊
# d1.speak() # 汪汪汪
# p1.speak() # 哼哼哼
Python崇尚的“鸭子类型”(duck typing):“如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。
比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度
# 鸭子类型:duck
class People:
def speak(self):
print('啊啊啊')
def run(self):
print('咻咻咻')
class Dog:
def speak(self):
print('汪汪汪')
def run(self):
print('嗖嗖嗖')
class Pig:
def speak(self):
print('哼哼哼')
def run(self):
print('咣咣咣')
peo1 = People()
d1 = Dog()
p1 = Pig()
peo1.run() # 咻咻咻
d1.run() # 嗖嗖嗖
p1.run() # 咣咣咣
#看起来像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
class Cpu: #Cpu类有两个与文件类型同名的方法,即read和write
def read(self):
pass
def write(self):
pass
class Process: #Process类有两个与文件类型同名的方法,即read和write
def read(self):
pass
def write(self):
pass
class Disk: #Disk类有两个与文件类型同名的方法,即read和write
def read(self):
pass
def write(self):
pass
x = 11 # x=int(11)
print(int) #
class Foo:
pass
print(Foo) #
'''
x = [1,2,3] # list([1,2,3])
y = [111,222] # list([1,2,3])
# x.append(4)
# y.append(3333)
list.append(x,4)
list.append(y,333)
print(x) # [1, 2, 3, 4]
print(y) # [111, 222, 333]
print(type(x)) #
'''
x = 111
print(type(x) is int) # True
print(isinstance(x,int)) # True
class Bar:
pass
class Foo(Bar):
pass
print(issubclass(Foo,Bar)) # True
内置方法都是在满足某种条件下自动触发的
str
此方法会在对象被打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型
class People:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
# print('===>')
return '<%s:%s>'%(self.name,self.age)
obj = People('egon',18)
print(obj) # print(obj.__str__())
del:会在对象被删除时自动触发。
class People:
def __init__(self,name,age,f):
self.name = name
self.age = age
self.f = f
def __del__(self):
print('===>')
# 回收资源
obj = People('egon',18,open('db.txt','w',encoding='utf-8'))
del obj
# print('运行完毕')
通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
class Foo:
def __init__(self, x, y):
self.x = x
self.y = y
def f1(self):
print('from f1')
obj = Foo(111, 222)
四个可以实现自省的函数
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
'''先通过多dir:查看某一个对象下 可以.出哪些属性来'''
# res = dir(obj)
# print(res)
'''可以通过字符串反射到真正的属性上,得到属性值'''
# print(obj.__dict__[res[-1]])
# print(obj.__dict__['x'])
'''四个内置函数的使用:通过字符串来操作属性值'''
# import re
#
# for attr in dir(obj):
# if not re.search("^__.*__$",attr):
# res=getattr(obj,attr)
# print(res)
hasattr()
# print(hasattr(obj,'x'))# 按字符串'x'判断有无属性obj.x
getattr()
# print(getattr(obj,'xxx',None)) # # 等同于obj.xxx,不存在该属性则返回默认值None
setattr()
# setattr(obj,"xxx",1111) # 等同于obj.xxx = 1111
delattr()
# delattr(obj,"xxx") # 等同于del obj.xxx
# m=__import__("time")
# m.sleep(3)
# getattr(m,'sleep')(3)