多态
什么是多态?
同一事物多种形态
class Animal:
def talk(self):
pass
class Cat(Animal):
def talk(self):
print('喵喵喵')
class Dog(Animal):
def talk(self):
print('汪汪汪')
class Pig(Animal):
def talk(self):
print('哼哼哼')
cat = Cat()
dog = Dog()
pig = Pig()
多态性
多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象,这就需要在设计时,把对象的使用方法统一成一种
class Animal:
def say(self):
print('动物发声的规律.....')
class People(Animal):
def say(self):
print('达咩达咩')
class Dog(Animal):
def say(self):
print('汪汪汪')
class Cat(Animal):
def say(self):
print('喵喵喵')
def say(obj):
obj.say()
obj1 = People()
obj2 = Dog()
obj3 = Cat()
say(obj1)
say(obj2)
say(obj3)
'''
达咩达咩
汪汪汪
喵喵喵
'''
类似len( )方法,我们可以在不考虑三者类型的情况下直接使用统计三个对象的长度。
print(len('hello'))
print(len([1, 2, 3, 4, 5, 6]))
print(len({'1': 1, '2': 2}))
'''
5
6
2
'''
鸭子类型
但其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象,这正是Python崇尚的“鸭子类型”(duck typing):“如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度,如下
class Txt:
def read(self):
pass
def write(self):
pass
class Disk:
def read(self):
pass
def write(self):
pass
绑定方法与非绑定方法
绑定方法
1、绑定给对象的方法
调用者是对象,自动传入的是对象
class Mysql:
def __init__(self,ip, port):
self.ip = ip
self.port = port
2、绑定给类的方法
调用者是类,自动传入的是类
'''
setting文件下:
IP = 127.6.26.26
PORT = 3306
'''
class Mysql:
def __init__(self,ip, port):
self.ip = ip
self.port = port
@classmethod
def from_conf(cls):
return Mysql(setting.IP, setting.PORT)
非绑定方法
为类中某个函数加上装饰器@staticmethod后,该函数就变成了非绑定方法,也称为静态方法。该方法不与类或对象绑定,类与对象都可以来调用它,但它就是一个普通函数而已,因而没有自动传值那么一说
import uuid
class MySQL:
def __init__(self,host,port):
self.id=self.create_id()
self.host=host
self.port=port
@staticmethod
def create_id():
return uuid.uuid1()
总结
总结: 绑定方法与非绑定方法的使用:若类中需要一个功能,该功能的实现代码中需要引用对象则将其定义成对象方法、需要引用类则将其定义成类方法、无需引用类或对象则将其定义成静态方法。
|