zoukankan      html  css  js  c++  java
  • 课时37:类与对象:面向对象编程

    目录:

      一、self是什么

      二、Python的魔法方法

      三、公有和私有

      四、课时37课后习题及答案

    *****************

    一、self是什么

    *****************

    对象的方法都有一个self参数,那这个self参数是什么呢?如果之前接触过其它的编程语言,例如c++,那么你应该很容易对号入座,Python的self其实就相当于C++的this指针。

    如果把类比作是图纸,那么由类实例化后的对象才是真正可以住的房子。根据一张图纸就可以设计出成千上万的房子,它们长得都差不多,但它们都有不同的主人。每个人都只能回到自己的家里,陪伴自己的孩子...所以self这里相当于每个房子的门牌号,有了self,你就可以轻松找到自己的房子。Python的self是同一个道理,由同一个类可以生成无数的对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,那么Python就知道需要操作哪个对象的方法了。

    通过一个例子感受下:

    class Ball:
        def setName(self, name):
            self.name = name
        def kick(self):
        print("我叫%s,该死的,谁踢我..." % self.name)
    
    >>> a = Ball()
    >>> a.setName('球A')
    >>> # 第一个参数self告诉Python是a对象在调用方法,因为是隐藏的并且由Python自己传入,所以我们这里不需要写进来。
    >>> b = Ball()
    >>> b.setName('球B')
    >>> c = Ball()
    >>> c.setName('土豆')
    >>> a.kick()
    我叫球A,该死的,谁踢我...
    >>> b.kick()
    我叫球B,该死的,谁踢我...
    >>> c.kick()
    我叫土豆,该死的,谁踢我...
    

    self参数的详解可以参考博客:https://blog.csdn.net/CLHugh/article/details/75000104

    **************************

    二、Python的魔法方法

    **************************

     Python的对象天生拥有一些神奇的方法,它们是面向对象的Python的一切。Python的这些具有魔力的方法,总是被下划线所包围的,今天就来说一说一个最基本的特殊方法:_ _init_ _()。

    通常把_ _init_ _()方法称作构造方法,_ _init_ _()的魔力体现在只要实例话一个对象,这个方法就会在这个对象被创建时自动调用(在c++里可以看到类似的东西,叫“构造函数”)。

    其实,实例化对象时是可以传入参数的,这些参数会自动传入_ _init_ _()方法中,可以通过重写这个方法来自定义对象的初始化操作。举个例子:

    class Ball:
        def __init__(self, name):
        self.name = name
        def kick(self):
        print("我叫%s,该死的,谁踢我..." % self.name)
    >>> p = Ball("土豆")
    >>> p.kick()
    我叫土豆,该死的,谁踢我...

    ******************

    三、公有和私有

    ******************

     一般面向对象的编程语言都会区分公有和私有的数据类型,像c++和Java它们使用public和private关键字,用于声明数据是公有的还是私有的,但在Python中并没有用类似的关键字来修饰。

    难道Python所有东西都是透明的?也不全是,默认上对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问:

    >>> class Person:
        name = '小甲鱼'
    
        
    >>> p = Person()
    >>> p.name
    '小甲鱼'

    为了实现类似私有变量的特征,Python内部采用了一种叫name mangling(名字改编)的技术,在Python中定义私有变量只需要在变量名或函数名前加上“_ _”两个下划线,那么这个函数或变量就会成为私有的了:

    >> class Person:
        __name = '小甲鱼'
    
        
    >>> p = Person()
    >>> p.__name
    Traceback (most recent call last):
      File "<pyshell#23>", line 1, in <module>
        p.__name
    AttributeError: 'Person' object has no attribute '__name'

    这样在外部将变量名“隐藏”起来了,理论上如果要访问,就需要从内部进行:

    class Person:
          __name = '小甲鱼'
          def __init__(self,name):
                self.__name = name
          def getName(self):
                return self.__name
    >>> p = Person("小甲鱼")
    >>> p.__name
    Traceback (most recent call last):
      File "<pyshell#25>", line 1, in <module>
        p.__name
    AttributeError: 'Person' object has no attribute '__name'
    >>> p.getName()
    '小甲鱼'
    

    但是你认真琢磨一下这个技术的名字name mangling(名字改编),那么不难发现其实Python只是动了一下手脚,把双下横线开头的变量进行了改名而已。实际上在外部你使用“_类名_ _变量名”即可访问双下横线开头的私有变量了:

    >>> p._Person__name
    '小甲鱼'

    (注:Python目前的私有机制其实是伪私有,Python的类是没有权限控制的,所有变量都是可以被外部调用的。)

    ********************************

     四、课时37课后习题及答案

    ********************************

  • 相关阅读:
    bzoj 3709: [PA2014]Bohater【贪心】
    bzoj 3714: [PA2014]Kuglarz【最小生成树】
    bzoj 2216: [Poi2011]Lightning Conductor【决策单调性dp+分治】
    bzoj 2087: [Poi2010]Sheep【凸包+极角排序+dp】
    bzoj 3830: [Poi2014]Freight【dp】
    bzoj 3930: [CQOI2015]选数【快速幂+容斥】
    bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式【后缀自动机】
    bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线【二分+spfa】
    bzoj 1640||1692: [Usaco2007 Dec]队列变换【后缀数组】
    bzoj 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛【Floyd】
  • 原文地址:https://www.cnblogs.com/DC0307/p/9525132.html
Copyright © 2011-2022 走看看