多态:
(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为。
1.多态是方法的多态,属性没有多态。
2.多态的存在有2个必要条件:继承、方法重写。
class Man:
def eat(self):
print("饿了,吃饭啦!")
class Chinese(Man):
def eat(self):
print("中国人用筷子吃饭")
class English(Man):
def eat(self):
print("英国人用叉子吃饭")
class Indian(Man):
def eat(self):
print("印度人用右手吃饭")
def manEat(m):
if isinstance(m, Man):
m.eat()
else:
print("不能吃饭")
manEat(Chinese())
manEat(Indian())
manEat(English())
#输出:中国人用筷子吃饭
#印度人用右手吃饭
#英国人用叉子吃饭
特殊方法和运算符重载
测试运算符的重载
class Person:
def __init__(self, name):
self.name = name
def __add__(self, other):
if isinstance(other, Person):
return "{0}--{1}".format(self.name, other.name)
else:
return "不是同类对象,不能相加"
def __mul__(self, other):
if isinstance(other, int):
return self.name * other
else:
return "不是同类对象,不能相乘"
p1 = Person("高琪")
p2 = Person("高兮兮")
x = p1 + p2
print(x)
print(p1 * 5)
#输出:高琪--高兮兮
# 高琪高琪高琪高琪高琪
测试特殊属性
class A:
pass
class B:
pass
class C(B, A):
def __init__(self, nn):
self.nn = nn
def cc(self):
print("cc")
c = C(3)
print(dir(c))
print(c.__dict__)
print(c.__class__)
print(C.__bases__)
print(C.mro())
print(A.__subclasses__())
#输出:['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'cc', 'nn']
#{'nn': 3}
#<class '__main__.C'>
#(<class '__main__.B'>, <class '__main__.A'>)
#[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
#[<class '__main__.C'>]