多态

day27

  • 一.多态
  • 二.一切皆为对象
  • 三.内置函数
    • isinstance和issubclass
      • isinstance
      • issubclass(sub, super)检查sub类是否是 super 类的派生类
  • 四.内置方法
  • 五.反射

一.多态

多态性指的是同一种事物有多种形态
例如:动物这种事物有多种形态,如人/狗/猪

特性:我们可以在不考虑某一个对象具体类型的前提下,直接使用该对象

父类有的功能,子类一定有

多态性的好处在于增强了程序的灵活性和可扩展性
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))  # 
'''

三.内置函数

isinstance和issubclass

isinstance

x = 111
print(type(x) is int)  # True
print(isinstance(x,int))  # True

issubclass(sub, super)检查sub类是否是 super 类的派生类

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)

你可能感兴趣的:(start,all,over,again)