课时37:类与对象:面向对象编程

时间:2023-01-02 11:59:25

目录:

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

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

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程

课时37:类与对象:面向对象编程