专栏首页python3课时37:类与对象:面向对象编程

课时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课后习题及答案

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python中@property和pro

    py3study
  • Python学习之类

    之前写的博客,都是借鉴别的博文或者是环境的配置,没有自己的东西,掌握的很少。以后的博文,我都会尽力加上一些自己的东西。现在开始进入我的python世界吧!

    py3study
  • Python:多态(一个接口多种实现)

    class Animal(object): ----def init(self,name): --------self.name=name

    py3study
  • 新鲜出炉面试题(三)

    You are never too old to set another goal or to dream a new dream.

    小闫同学啊
  • Struts2之Validation的简单使用实例

    本来不打算写这些细枝末节的东西了,因为在文档中都有现成的实例,写了也只能自己用来参考,不过这个Validation文档中给的不全,从网上查之后才知道用法。 首先...

    the5fire
  • 浅析.NET的反射特性

         在.net框架体系内,反射特性较多的应用到。反射的相关定义分为两种。     自然解释:射是一种自然现象,表现为受刺激物对刺激物的逆反应;这...

    彭泽0902
  • 设计模式-组合模式(Composite)

    定义 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.

    高广超
  • MyBatis-Plus Wrapper条件构造器查询大全

    kirin
  • pytorch中的weight-initilzation用法

    我们从网上down下来的模型与我们的模型可能就存在一个层的差异,此时我们就需要重新训练所有的参数是不合理的。

    砸漏
  • Android 接收推送消息跳转到指定页面的方法

    App在前台,这个时候需要弹出一个对话框,提醒用户有新的消息,是否要查看,查看的话跳转到指定页面

    砸漏

扫码关注云+社区

领取腾讯云代金券