鱼C论坛

 找回密码
 立即注册
查看: 1738|回复: 0

[技术交流] 第十章:类和对象(36-37课时)

[复制链接]
发表于 2017-8-14 16:33:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 向西而笑 于 2017-8-26 21:18 编辑
           36课时:给大家介绍对象
对象的基本概念封装:把乱七八糟的东西扔到列表里就是数据层面的封装,把常用的代码段打包成一个函数就是语句层面的封装。对象就是两者的合二为一,即把数据和代码封装在一起,是一种更高级别的封装。

对象 = 属性 + 方法
属性即静态的特征,方法即动态的特征。在实际的编程中,属性是变量,方法是函数。

类和对象的关系两者犹如模具和模具制作出来的东西。一个类为他的全部对象给出了统一的定义,而他的每个对象则是符合这个定义的实体。因此类和对象的关系就是抽象和具体的关系。比如我们定义了一个‘猫类’,那么‘猫’实例化的对象有:波斯猫、Tom(猫和老鼠动画片)叮当猫、HelloKitty、黑猫警长......
类的属性定义应该尽可能地抽象,因为这样更符合面向对象的思维。
例子:

  1. >>> class Cat:
  2.     #属性定义
  3.     legs = 4 #四条腿
  4.     tail = True #有尾巴
  5.     skil = ('climb tree','catch rat') #技能有爬树、抓老鼠
  6.     #方法定义
  7.     def voice(self):
  8.         print('喵~喵~')
  9.     def duty(self):
  10.         print('那有只老鼠,又是一顿美味的大餐...')

  11.       
  12. >>> tom = Cat()
  13. >>> tom.voice()
  14. 喵~喵~
  15. >>> tom.duty()
  16. 那有只老鼠,又是一顿美味的大餐...
  17. >>> tom.legs
  18. 4
  19. >>> tom.tail
  20. True
复制代码



上面的例子里先定义了一个类—Cat,这个类有三条属性和两个方法。
然后我在把这个类给实例化,tom也拥有了Cat的属性和方法。



面向对象的几个特征封装性、继承性和多态性

封装性:对外部隐藏对象的工作细节。
继承性:子类自动共享父类属性和方法的机制。
举例:

  1. >>> class My_list(list):
  2.    pass

  3. >>> list2 = My_list()
  4. >>> list2.extend([4,3,6,5,2,1])
  5. >>> list2
  6. [4, 3, 6, 5, 2, 1]
  7. >>> list2.sort()
  8. >>> list2
  9. [1, 2, 3, 4, 5, 6]
复制代码



上例中新的子类My_list继承了父类list,所以拥有list所有的属性和方法,所以实例化的list2能够使用listextend()sort()方法。
多态性:可以对不同对象调用相同的方法,得到不同的结果。
举例:

  1. >>> class Tiger:
  2.    def run(self):
  3.           print('随风奔跑自由是方向....')
  4. >>> class Lion:
  5.    def run(self):
  6.           print('追逐闪电和雷的力量...')
  7. >>> t = Tiger()
  8. >>> l = Lion()
  9. >>> t.run()
  10. 随风奔跑自由是方向....
  11. >>> l.run()
  12. 追逐闪电和雷的力量...
复制代码



上例中tl都调用了run()方法,却得到不同的结果这就是多态性的体现。



               37课时:面向对象编程
类方法中的self参数在类中的方法定义中都要定义一个self参数,这有什么作用呢?相当于C里面的this指针,当类实例化后调用方法使得程序知道是哪个对象调用的。举例:

  1. >>> class Ball:
  2.    def setName(self,name):
  3.           self.name = name
  4.    def kick(self):
  5.           print('我叫%s,卧槽,谁踢我...'%self.name)

  6.          
  7. >>> a = Ball()
  8. >>> a.setName('球A')
  9. >>> a.kick()
  10. 我叫球A,卧槽,谁踢我...
  11. >>> b = Ball()
  12. >>> b.setName('土豆')
  13. >>> b.kick()
  14. 我叫土豆,卧槽,谁踢我...
复制代码




python的魔法方法魔法方法就是可以给你的类增加“魔力”的特殊方法,如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被调用,而这一切是自动发生的......这些魔法方法是被双下划线包围,如__init__,__eq__......
__init__(self):我们把这个特殊方法称作构造方法。实例化对象是可以传入参数的,这些参数会自动的传入到__init__方法中(__init__(self,param1,param2...))我们可以重写这个方法来自定义对象的初始化操作。例如:

  1. >>> class Ball:
  2.    def __init__(self,name):
  3.           self.name = name
  4.    def kick(self):
  5.           print('我叫%s,该死的,谁踢我...'%self.name)

  6.          
  7. >>> b = Ball('土豆')
  8. >>> b.kick()
  9. 我叫土豆,该死的,谁踢我...
复制代码

上例实例化对象b时传入了一个参数‘土豆’,所以调用kick()方法时显示了传入的参数。还可以设置默认参数,这样可以直接调用kick()方法,如:

  1. >>> class Ball:
  2.    def __init__(self,name='呃,我是个球'):
  3.           self.name = name
  4.    def kick(self):
  5.           print('我叫%s,该死的,谁踢我...'%self.name)

  6.          
  7. >>> c = Ball()
  8. >>> c.kick()
  9. 我叫呃,我是个球,该死的,谁踢我...
复制代码




公有和私有
python里的属性和方法默认是公有的。在Python中定义私有变量只要在变量名或函数名前加上’__’两个下划线,那么这个函数或变量就变成私有的了。
例子

  1. >>> class Person:
  2.    name = '小甲鱼'
  3. >>> p = Person()
  4. >>> p.name
  5. '小甲鱼'
  6. >>> class Person:
  7.    __name = '小甲鱼'
  8. >>> p = Person()
  9. >>> p.name
  10. Traceback (most recent call last):
  11.   File "<pyshell#8>", line 1, in <module>
  12.     p.name
  13. AttributeError: 'Person' object has no attribute 'name'
复制代码


上面的例子加上了__就不能访问name这个属性了。但是还是有办法访问的,其实程序是在__变量前面加上了_类名,变成了_类名__变量名

  1. >>> class Person:
  2.         __name = '小甲鱼'
  3. >>> p = Person()
  4. >>> p._Person__name
  5. '小甲鱼’
复制代码








评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-6 03:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表