搞懂Python类的多态性
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def color(self):
pass
class Dog(Animal):
def color(self):
print("Dog is black")
class Cat(Animal):
def color(self):
print("Cat is blue")
dog = Dog()
cat = Cat()
dog.color()
cat.color()
# 定义一个统一的接口来访问
def func(object):
object.color()
func(dog)
Dog is black
Cat is blue
Dog is black
增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
增加了程序额可扩展性:通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def color(self):
pass
class Dog(Animal):
def color(self):
print("Dog is black")
class Cat(Animal):
def color(self):
print("Cat is blue")
class Pig(Animal): # 属于动物的另外一种形态:猪
def color(self):
print("Pig is white")
dog = Dog()
cat = Cat()
pig = Pig()
# 统一接口,对于使用者来说,自己的代码根本无需改动
def func(object):
object.color()
# 甚至连调用方式都无需改变,就能调用出pig的talk功能
func(pig)
Pig is white
class Duck():
def speak(self):
print("Duck speaking like a duck")
def swim(self):
print("Duck swim like a duck")
class Person():
def speak(self):
print("this people speaking like a duck")
def swim(self):
print("this people swim like a duck")
方法名 | 运算符和表达式 | 说明 |
__add__(self,rhs) | self + rhs | 加法 |
__sub__(self,rhs) | self - rhs | 减法 |
__mul__(self,rhs) | self * rhs | 乘法 |
__truediv__(self,rhs) | self / rhs | 除法 |
__floordiv__(self,rhs) | self //rhs | 地板除 |
__mod__(self,rhs) | self % rhs | 取模(求余) |
__pow__(self,rhs) | self **rhs | 幂运算 |
class Number():
def __init__(self,v):
self.data = v
def __repr__(self):
return "Number(%d)"%self.data
def __add__(self,other):
v = self.data + other.data
return Number(v)
def __sub__(self,other):
v = self.data - other.data
return Number(v)
n1 = Number(100)
n2 = Number(200)
n3 = n1 + n2
print(n3)
n4 = n2 - n1
print(n4)
print(n1.__add__(n2))
print(n2.__sub__(n1))
Number(300)
Number(100)
Number(300)
Number(100)
方法名 | 运算符和表达式 | 说明 |
__radd__(self,lhs) | lhs + self | 加法 |
__rsub__(self,lhs) | lhs - self | 减法 |
__rmul__(self,lhs) | lhs * self | 乘法 |
__rtruediv__(self,lhs) | lhs / self | 法 |
__rfloordiv__(self,lhs) | lhs // self | 地板除 |
__rmod__(self,lhs) | lhs % self | 取模(求余) |
__rpow__(self,lhs) | lhs ** self | 幂运算 |
方法名 | 运算符和表达式 | 说明 |
__iadd__(self,rhs) | self += rhs | 加法 |
__isub__(self,rhs) | self -= rhs | 减法 |
__imul__(self,rhs) | self *= rhs | 乘法 |
__itruediv__(self,rhs) | self /= rhs | 除法 |
__ifloordiv__(self,rhs) | self //=rhs | 地板除 |
__imod__(self,rhs) | self %= rhs | 取模(求余) |
__ipow__(self,rhs) | self **=rhs | 幂运算 |
方法名 | 运算符和表达式 | 说明 |
__lt__(self,rhs) | self < rhs | 小于 |
__le__(self,rhs) | self <= rhs | 小于等于 |
__gt__(self,rhs) | self > rhs | 大于 |
__ge__(self,rhs) | self >= rhs | 大于等于 |
__eq__(self,rhs) | self == rhs | 等于 |
__ne__(self,rhs) | self != rhs | 不等于 |
方法名 | 运算符和表达式 | 说明 |
__and__(self,rhs) | self & rhs | 位与 |
__or__(self,rhs) | self | rhs | 位或 |
__xor__(self,rhs) | self ^ rhs | 位异或 |
__lshift__(self,rhs) | self <<rhs | 左移 |
__rshift__(self,rhs) | self >>rhs | 右移 |
方法名 | 运算符和表达式 | 说明 |
__and__(self,lhs) | lhs & rhs | 位与 |
__or__(self,lhs) | lhs | rhs | 位或 |
__xor__(self,lhs) | lhs ^ rhs | 位异或 |
__lshift__(self,lhs) | lhs <<rhs | 左移 |
__rshift__(self,lhs) | lhs >>rhs | 右移 |
方法名 | 运算符和表达式 | 说明 |
__iand__(self,rhs) | self & rhs | 位与 |
__ior__(self,rhs) | self | rhs | 位或 |
__ixor__(self,rhs) | self ^ rhs | 位异或 |
__ilshift__(self,rhs) | self <<rhs | 左移 |
__irshift__(self,rhs) | self >>rhs | 右移 |
方法名 | 运算符和表达式 | 说明 |
__neg__(self) | - self | 负号 |
__pos__(self) | + self | 正号 |
__invert__(self) | ~ self | 取反 |
方法名 | 运算符和表达式 | 说明 |
__getitem__(self,i) | x = self(i) | 索引/切片取值 |
__setitem__(self,i,v) | self[i] = v | 索引/切片赋值 |
__delitem__(self,i) | del self[i] | del语句删除索引/切片 |