python基础 14 面向对象特性②

101 阅读3分钟

一 多态

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. 如果实例属性和方法名发生命名冲突: 
    实例属性会覆盖掉方法对象