一 多态
1. 一种类事物拥有多种形态
动物-猫,狗,人,鱼 序列-列表,字符串,元组
2. 多态和继承息息相关
没有继承,就没有多态
def fun(animal): # animal [1,2,3]
animal.eat() # 正常执行的原因:animal变量中代表的对象,一定会有eat方法---eat方法时父类继承下 来的
class Animal:
def eat(self):
print('animal eat')
class Dog(Animal):
pass
class Cat(Animal):
pass
class Bird(Animal):
pass
class Monkey(Animal):
pass
class Snake(Animal):
pass
class Panda(Animal):
pass
fun(Snake())
fun(Animal())
二 多态性
1. 向不同的对象发送同一条信息,不同的对象在接收时,会产生不同的行为
2. 和继承没有必然联系
class Dog:
def run(self):
print('Dog run')
class Car:
def run(self):
print('Car run')
class Hourse:
def run(self):
print('Hourse run')
def fun(obj):
obj.run()
fun(Dog())
fun(Car())
三 多态和多态性的好处
1. 增加程序的灵活性
2. 增加了程序的可扩展性
四 内置函数或者类
1 isinstance()
1. issubclass(cls, class_or_tuple)--函数
判断obj是否是第二个参数的子类实例对象
如果第二个参数是元组(多个类),只要有任意一个类是实例对象的父类(包含父类的父类),则返回 True,否则返回False
class A:pass
class B:pass
class D:pass
class C(A):pass
print(issubclass(C,A))
print(issubclass(C,D))
print(issubclass(C,C))
print(issubclass(C,(A,B,D)))
print(issubclass(C,(B,D)))
2 isinstance()
1. isinstance(obj, class_or_tuple)---函数
判断obj是否是第二个参数的子类实例对象
如果第二个参数是元组(多个类),只要有任意一个类是实例对象的父类(包含父类的父类),则返回 True,否则返回False
class A:pass
class B:pass
class D:pass
class C(A):pass
a=A()
c=C()
print(isinstance(a,A))
print(isinstance(a,B))
print(isinstance(c,C))
print(isinstance(c,A))
print(isinstance(c,(A,B,D)))
print(isinstance(c,(B,D)))
3 hasattr
1. hasattr(obj, name)--函数
判断obj中是否有name的属性
name:是str
class A:
age=18
__sex=True
a=A()
print(hasattr(a,'age'))
print(hasattr(a,'hehe'))
print(hasattr(a,'_A__sex'))
4 getattr
1. getattr(object, name[, default])
从object中获得name属性,如果属性不存在,则返回default值,如果default值没有给出,则直接报错
name是str
class A:
age=18
__sex=True
a=A()
print(getattr(a,'age'))
print(getattr(a,'hehe','属性不存在'))
print(getattr(a,'hehe'))
5 setattr
1. setattr(obj, name, value)
在obj对象中设置name属性,值为value
class A:
age=18
__sex=True
a=A()
setattr(a,'hehe',100)
setattr(a,'hehe',200)
print(getattr(a,'hehe'))
6 delattr
1. delattr(obj, name)
从obj中删除name属性
class A:
def __init__(self):
self.age=18
a=A()
delattr(a,'age')
print(hasattr(a,'age'))
7 property
1. property是一个类,返回一个property对象
2. property(fget=None, fset=None, fdel=None, doc=None)
fget:被关联的属性的get方法
fset:被关联的属性的set方法
fdel:被关联的属性的del方法
doc:文档说明
3. 作用:
将一个属性和另一个属性进行关联
class Student:
def __init__(self):
self.__socre=90
def getScore(self):
return self.__socre
def setScore(self,newScore):
self.__socre=newScore
def delScore(self):
del self.__socre
score=property(getScore,setScore,delScore,'hehe')
s=Student()
print(s.score)
print(s.getScore())
s.score=100
print(s.getScore())
del s.score
print(s.getScore())
五 补充
1. 如果类属性和方法名发生命名冲突:
出现在后面的对象会覆盖掉前面的对象
2. 如果实例属性和方法名发生命名冲突:
实例属性会覆盖掉方法对象