VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • python基础(25):面向对象三大特性二(多态、封装)(2)

test(self):
  • ... self.__fa() #只会与自己所在的类为准,即调用_A__fa
  • ...
  • >>> class B(A):
  • ... def __fa(self):
  • ... print('from B')
  • ...
  • >>> b=B()
  • >>> b.test()
  • from A
  • 2.3 封装与扩展性

    封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。

    
    
    1. #类的设计者
    2. class Room:
    3. def __init__(self,name,owner,width,length,high):
    4. self.name=name
    5. self.owner=owner
    6. self.__width=width
    7. self.__length=length
    8. self.__high=high
    9. def tell_area(self): #对外提供的接口,隐藏了内部的实现细节,此时我们想求的是面积
    10. return self.__width * self.__length
    11.  
    12. #使用者
    13. >>> r1=Room('卧室','egon',20,20,20)
    14. >>> r1.tell_area() #使用者调用接口tell_area
    15.  
    16. #类的设计者,轻松的扩展了功能,而类的使用者完全不需要改变自己的代码
    17. class Room:
    18. def __init__(self,name,owner,width,length,high):
    19. self.name=name
    20. self.owner=owner
    21. self.__width=width
    22. self.__length=length
    23. self.__high=high
    24. def tell_area(self): #对外提供的接口,隐藏内部实现,此时我们想求的是体积,内部逻辑变了,只需求修该下列一行就可以很简答的实现,而且外部调用感知不到,仍然使用该方法,但是功能已经变了
    25. return self.__width * self.__length * self.__high
    26.  
    27. #对于仍然在使用tell_area接口的人来说,根本无需改动自己的代码,就可以用上新功能
    28. >>> r1.tell_area()

    2.4 property属性

    什么是特性property?

    将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则。

    除此之外,看下:

    
    
    1. ps:面向对象的封装有三种方式:
    2. public
    3. 这种其实就是不封装,是对外公开的
    4. protected
    5. 这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开
    6. private
    7. 这种封装对谁都不公开

    python并没有在语法上把它们三个内建到自己的class机制中,在C++里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现。

    
    
    1. class Foo:
    2. def __init__(self,val):
    3. self.__NAME=val #将所有的数据属性都隐藏起来
    4.  
    5. @property
    6. def name(self):
    7. return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
    8.  
    9. @name.setter
    10. def name(self,value):
    11. if not isinstance(value,str): #在设定值之前进行类型检查
    12. raise TypeError('%s must be str' %value)
    13. self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
    14.  
    15. @name.deleter
    16. def name(self):
    17. raise TypeError('Can not delete')
    18.  
    19. f=Foo('egon')
    20. print(f.name)
    21. # f.name=10 #抛出异常'TypeError: 10 must be str'
    22. del f.name #抛出异常'TypeError: Can not delete'

    一个静态属性property本质就是实现了get,set,delete三种方法。

    
    
    1. class Foo:
    2. @property
    3. def AAA(self):
    4. print('get的时候运行我啊')
    5.  
    6. @AAA.setter
    7. def AAA(self,value):
    8. print('set的时候运行我啊')
    9.  
    10. @AAA.deleter
    11. def AAA(self):
    12. print('delete的时候运行我啊')
    13.  
    14. #只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
    
    相关教程