特性,函数和方法

self参数事实上正是方法和函数的区别。方法(更专业一点可以称为绑定方法)将它们的第一个参数绑定到所属的实例上,因此无需显示提供该参数。当然也可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了:

>>>class Class:
>>>    def method(self):
>>>        print('I have a self!')
>>>def function():
>>>    print("I don't...")
>>>instance = Class()
>>>instance.method()
>>>I have a self!
>>>instance.method()
>>>I don't...

注意,self参数并不依赖于调用的方法的方式,前面我们使用的是instance.method(实例.方法)的形式,可以随意使用其他变量引用同一个方法:

>>>class Bird:
>>>    song = 'Squaawk!'
>>>    def sing(self):
>>>        print(self.song)
>>>bird = Bird()
>>>bird.sing()
Squaawk!
>>>birdsong = bird.sing
>>>birdsong()
Squaawk!

尽管最后一个方法调用看起来 与函数调用十分相似,但是变量birdsong引用绑定方法bird.sing上,也就意味着这还是会对self参数进行访问(也就是说,它依旧绑定到类的相同实例上)。
再论私有化
默认情况下,程序可以从外部访问一个对象的特性。再次使用前面讨论过得有关封装的例子:

>>>c.name
'Sir Lancelot'
>>>c.getName()
'Sir Gumby'

Python并不直接支持私有方法,而要靠程序员自己把握在外部进行特性修改的时机。毕竟在使用对象前应该知道如何使用。但是,可以用一些小技巧达到私有特性的效果。
为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可:

>>>class Secretive:
>>>    def__inaccessible(self):
>>>    print("Bet you can't see me...")
>>>    def accessible(self):
>>>        print("The secret message is:")
>>>        self.__inaccessible()

现在__inaccessible从外界是无法访问的,而在类的内部还能使用(比如从accessible)访问:

>>>s = Secretive()
>>>s.__inaccessible()
Traceback(most recent call last):
  File"<pyshell#112>",line 1, in ?
    s.__inaccessible()
AttributeError:Secretive instance has no attribute'__inaccessible'
>>>s.accessible()
The secret message is:
Bet you can't see me...

尽管双下划线有些奇怪,但是看起来像是其他语言中的标准的私有方法。真正发生的事情才是不标准的。类的内部定义中,所有以双下划线开始的名字都被“翻译”成前面加上单下划线和类名的形式。

>>>Secretive._Secretive__inaccessible
<unbound method Secretive.__inaccessible>

在了解了这些幕后的事情后,实际上还是能在类外访问这些私有方法,尽管不应该这么做:

>>>s._Secretive__inaccessible()
Bet you can't see me...

简而言之,确保其他人不会访问对象的方法和特性是不可能的,但是这类“名称变化术”就是他们不应该访问这些函数或者特性的强有力的信号。
如果不需要使用这种方法但是又想让其他对象不要访问内部数据,那么可以使用单下划线。这不过是个习惯,但的确有实际效果,例如,前面有下划线的名字都不会被带星号的import语句(from module import *)导入。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值