python的访问性问题

python和C++、Java等语言不同,其对象属性和方法的访问权限只有两种:private(私有)、public(公有)。

1. 公有和私有

一般情况下,python类中的属性为公有,若想使其变为私有,则在给属性和方法命名时,用两个下划线开头:

class Test:
    """docstring for Test"""

    def __init__(self, content):
        self.__content = content

    def __say(self):
        print('say something:')
        print(self.__content)


def main():
    test = Test('hello')
    # AttributeError: 'Test' object has no attribute '__content'
    print(test.__content)
    # AttributeError: 'Test' object has no attribute '__say'
    test.__say()


if __name__ == '__main__':
    main()

注:

  • 实际开发中,并不建议将属性或方法设置为私有(会导致子类无法访问该属性或方法);
  • 通常让属性或方法名以单下划线开头表示该属性或方法为protected(保护的),但这中做法只具有识别意义,并非其他语言中的protected,外界仍然可以访问这样的属性和方法。

2. @property
将对象的属性设置为protected的时(字面意义),需要通过getter和setter函数来访问,python中提供的机制是@property:

class Person(object):
    """docstring for Person"""

    def __init__(self, name, age):
        self._name = name
        self._age = age

    # getter函数
    @property
    def name(self):
        return self._name
    
    # getter函数
    @property
    def age(self):
        return self._age

    # setter函数
    @age.setter
    def age(self, age):
        self._age = age


def main():
    person = Person('Helen', 18)
    # 这里访问的其实是函数age()
    print(person.age)
    # 这里实际上调用了age的setter函数
    person.age = 20
    print(person.age)
    # 由于没有给_name设置setter函数,这里会报错:can't set attribute
    person.name = 'Zoey'

if __name__ == '__main__':
    main()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值