私有化

没怎么学过Java,不过在Java中很容易就能看到各种私有变量。Python中有吗?
有的呢,下面就是变量是否为私有的区别:

  • xx: 公有变量

  • _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问

  • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
  • xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己构建这样的名字!
  • xx_:单后置下划线,用于避免与Python关键词的冲突(通常是自己不知道该怎么去名字的时候到了/坏笑)

如下:

#coding=utf-8

class Person(object):
    def __init__(self, name, age, taste):
        self.name = name
        self._age = age 
        self.__taste = taste

    def showperson(self):
        print(self.name)
        print(self._age)
        print(self.__taste)

    def dowork(self):
        self._work()
        self.__away()


    def _work(self):
        print('my _work')

    def __away(self):
        print('my __away')

比如我现在可以从实例化对象中访问showpersondowork_work 三个方法。
但是不能访问_away_方法。

>>> a.__way()
>>>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-32-484625135d8c> in <module>()
----> 1 a.__way()

AttributeError: 'Person' object has no attribute '__way'
>>> a._Person__away()
my __away
# 虽然为私有方法,但最终还是能够访问。

因为它是通过name mangling名字重整来实现的(目的就是以防子类意外重写基类的方法或者属性)
既然这样,当然我们可以通过更改名字就能访问了。
可以使用Class._dir_来查看重整后的名字。
如:_Class__object)机制就可以访问private了。

Conclusion:

  • 父类中属性名为__名字的,子类不继承,子类不能访问

  • 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性

  • _名的变量、函数、类在使用from xxx import *时都不会被导入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值