一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

self是什么?

  Python的self其实就相当于C++的this指针。由同一个类可以生产无数对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,那么python就知道需要操作哪个对象的方法了。

 1 >>> class Ball:
 2     def setName(self,name):
 3         self.name = name
 4     def kick(self):
 5         print('我叫%s,该死的,谁踢我。。。' % self.name)
 6 
 7         
 8 >>> a = Ball()
 9 
10 >>> a.setName('球A')
11 >>> b = Ball()
12 
13 >>> b.setName('球B')
14 
15 >>> a.kick()
16 我叫球A,该死的,谁踢我。。。
17 >>> b.kick()
18 我叫球B,该死的,谁踢我。。。

你听说过Python的魔法方法吗?

  python的这些具有魔法的方法,总是被双下划线所包围,例如__init__(),即构造方法,也称构造函数,这个方法会在对象被创建时自动调用。其实,实例化对象时是可以传入参数的,这些参数会自动传入__init__()方法中,可以通过重写这个方法来自定义对象的初始化操作

实例:

 1 >>> class Ball():
 2 def __init__(self,name):
 3 self.name = name
 4 def kick(self):
 5 print('我叫%s,该死的,谁踢我。。。' % self.name)
 6 
 7 
 8 >>> b = Ball('小土豆')
 9 >>> b.kick()
10 我叫小土豆,该死的,谁踢我。。。

公有和私有?python内部采用了一种叫 name mangling(名字改编)的技术

默认上对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问:

1 >>> class Person:
2 name = '亦我飞也'
3 
4 
5 >>> p = Person()
6 >>> p.name
7 '亦我飞也'

为了实现定义私有变量,只需要在变量名或函数名前加上"__"两个下划线,那么这个函数或变量就会变成私有的了:

私有变量不可以直接由外部访问

 1 >>> class Person:
 2 __name = '亦我飞也'
 3 
 4 
 5 >>> p = Person()
 6 >>> p.__name
 7 Traceback (most recent call last):
 8 File "<pyshell#65>", line 1, in <module>
 9 p.__name
10 AttributeError: 'Person' object has no attribute '__name'

室友变量可以由内部(内部函数)进行访问

 1 >>> class Person:
 2 __name = '亦我飞也'
 3 def getName(self):
 4 return self.__name
 5 
 6 
 7 >>> p = Person()
 8 >>> p.__name
 9 Traceback (most recent call last):
10 File "<pyshell#72>", line 1, in <module>
11 p.__name
12 AttributeError: 'Person' object has no attribute '__name'
13 >>> p.getName()
14 '亦我飞也'

其实,name mangling(名字改编)技术,只是把双下划线开头的变量进行了改名而已。实际上在外部使用“_类名__变量名“即可访问双下划线开头的私有变量了:

1 >>> p._Person__name
2 '亦我飞也'
posted on 2023-08-23 10:29  一杯清酒邀明月  阅读(15)  评论(0编辑  收藏  举报