鱼C论坛

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

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

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

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

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

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

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

类和对象的关系两者犹如模具和模具制作出来的东西。一个类为他的全部对象给出了统一的定义,而他的每个对象则是符合这个定义的实体。因此类和对象的关系就是抽象和具体的关系。比如我们定义了一个‘猫类’,那么‘猫’实例化的对象有:波斯猫、Tom(猫和老鼠动画片)叮当猫、HelloKitty、黑猫警长......
类的属性定义应该尽可能地抽象,因为这样更符合面向对象的思维。
例子:
>>> class Cat:
    #属性定义
    legs = 4 #四条腿
    tail = True #有尾巴
    skil = ('climb tree','catch rat') #技能有爬树、抓老鼠
    #方法定义
    def voice(self):
        print('喵~喵~')
    def duty(self):
        print('那有只老鼠,又是一顿美味的大餐...')
 
       
>>> tom = Cat()
>>> tom.voice()
喵~喵~
>>> tom.duty()
那有只老鼠,又是一顿美味的大餐...
>>> tom.legs
4
>>> tom.tail
True


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



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

封装性:对外部隐藏对象的工作细节。
继承性:子类自动共享父类属性和方法的机制。
举例:
>>> class My_list(list):
   pass
 
>>> list2 = My_list()
>>> list2.extend([4,3,6,5,2,1])
>>> list2
[4, 3, 6, 5, 2, 1]
>>> list2.sort()
>>> list2
[1, 2, 3, 4, 5, 6]


上例中新的子类My_list继承了父类list,所以拥有list所有的属性和方法,所以实例化的list2能够使用listextend()sort()方法。
多态性:可以对不同对象调用相同的方法,得到不同的结果。
举例:
>>> class Tiger:
   def run(self):
          print('随风奔跑自由是方向....')
>>> class Lion:
   def run(self):
          print('追逐闪电和雷的力量...')
>>> t = Tiger()
>>> l = Lion()
>>> t.run()
随风奔跑自由是方向....
>>> l.run()
追逐闪电和雷的力量...


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



               37课时:面向对象编程
类方法中的self参数在类中的方法定义中都要定义一个self参数,这有什么作用呢?相当于C里面的this指针,当类实例化后调用方法使得程序知道是哪个对象调用的。举例:
>>> class Ball:
   def setName(self,name):
          self.name = name
   def kick(self):
          print('我叫%s,卧槽,谁踢我...'%self.name)
 
         
>>> a = Ball()
>>> a.setName('球A')
>>> a.kick()
我叫球A,卧槽,谁踢我...
>>> b = Ball()
>>> b.setName('土豆')
>>> b.kick()
我叫土豆,卧槽,谁踢我...



python的魔法方法魔法方法就是可以给你的类增加“魔力”的特殊方法,如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被调用,而这一切是自动发生的......这些魔法方法是被双下划线包围,如__init__,__eq__......
__init__(self):我们把这个特殊方法称作构造方法。实例化对象是可以传入参数的,这些参数会自动的传入到__init__方法中(__init__(self,param1,param2...))我们可以重写这个方法来自定义对象的初始化操作。例如:
>>> class Ball:
   def __init__(self,name):
          self.name = name
   def kick(self):
          print('我叫%s,该死的,谁踢我...'%self.name)
 
         
>>> b = Ball('土豆')
>>> b.kick()
我叫土豆,该死的,谁踢我...
上例实例化对象b时传入了一个参数‘土豆’,所以调用kick()方法时显示了传入的参数。还可以设置默认参数,这样可以直接调用kick()方法,如:
>>> class Ball:
   def __init__(self,name='呃,我是个球'):
          self.name = name
   def kick(self):
          print('我叫%s,该死的,谁踢我...'%self.name)
 
         
>>> c = Ball()
>>> c.kick()
我叫呃,我是个球,该死的,谁踢我...



公有和私有
python里的属性和方法默认是公有的。在Python中定义私有变量只要在变量名或函数名前加上’__’两个下划线,那么这个函数或变量就变成私有的了。
例子
>>> class Person:
   name = '小甲鱼'
>>> p = Person()
>>> p.name
'小甲鱼'
>>> class Person:
   __name = '小甲鱼'
>>> p = Person()
>>> p.name
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    p.name
AttributeError: 'Person' object has no attribute 'name'

上面的例子加上了__就不能访问name这个属性了。但是还是有办法访问的,其实程序是在__变量前面加上了_类名,变成了_类名__变量名
>>> class Person:
        __name = '小甲鱼'
>>> p = Person()
>>> p._Person__name
'小甲鱼’







评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 10:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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