python 私有化属性

python 没有和其他编程语言一样的定义共有属性和私有属性的关键字,实现属性私有化和属性保护,都是使用代码格式进行的伪效果。

  • 属性名称什么下划线都不加 就是共有属性
    - 可以在类内使用
    - 可以子类继承内部使用
    - 可以在实例化对象使用
    - 可以在子类实例化调用
    - 在模块直接类名.属性使用
    - 在模块直接子类名.属性使用
    - 在其他文件 import 模块名称 模块名称.属性 可以使用
    - 在其他文件 from 模块名称 import * 属性 可以使用

  • _单下划线 属性受保护
    - 可以在类内部使用
    - 可以子类继承内部使用
    - 下面使用警告
    - 可以在实例化对象使用
    - 可以在子类实例化调用
    - 在模块直接类名.属性使用
    - 在模块直接子类名.属性使用
    - 在其他文件 import 模块名称 模块名称.属性 可以使用
    - 不可以使用
    - 在其他文件 from 模块名称 import * 属性
    - 但是如果在__all__ = [] 添加了属性名称,可以跨模块使用,而且不警告

  • __双下划线 表示私有化属性
    - 只能在类的内部使用,
    - 其他地方都不能使用
    - 实现原理:重命名,python 内部自动把双下划线属性,更名为_类名__属性,所以外部调用不成功,如果非要实线,也可以使用 _类名__属性调用,不建议!!!

私有化使用场景:
  1. 保护属性: 比如银行存款等,存款直接外放非常危险,就可以私有化,然后通过类提供的方法增加删减铅笔的金额,对存款进行保护。
  2. 内部过滤:过滤一下不符合属性的数据,数据不对,不进行操作,比如银行存款,取出比银行存款还多的钱,可以通过方法内部进行过滤,不用在外部进行对比。

补充: 命名规范

  1. xx_ 是为了怕和系统关键字冲突所加的下划线
  2. 变量前后双下划线 是系统内置关键字,尽量避免这样命名 如__xx__ 这样
只读属性
方法1 property装饰器方法
  • 先私有化属性
  • 然后在把属性开放出来
  • 通过调用方法的方式读取私有化属性,但是 这样在实例设置__属性的时候,就重命名一个属性,
class bank(object):
	def __init__(self):
		self.__moeny = 10000
	def getmoeny(self):
		return self.__moeny	
  • 通过使用装饰器 property 可以读取 修改和删除 私有化属性
  • 使用property之后,可以使用属性的方式访问私有属性
  • 使用proprety装饰器之后,在增加修改和删除属性的时候,属性装饰器下方法的名称.setter增加修改属性,通过方法名称。deleter 删除属性
  • 经典类里面 修改属性和删除属性无效。 在新式类里面才可以使用 python3默认是新式类
class bank(object):
	def __init__(self):
		self.__moeny = 10000
	@property
	def moeny(self):
		return self.__moeny	
	@moeny.setter
	def money(self,val):
		self.__money = val
	@money.deleter
	def money(self):
		del self.__money	

使用方法1之后:
还可以使用实例._类名__属性 =值 还是可以修改的
实例.dict[‘属性’] = 值 也是可以修改的

使用方法2之后:
实例._类名__属性 =值 还是不可以修改了
实例.dict[‘属性’] = 值 也是可以修改的

方法2 :setattr(self,key,value)
  • 当通过实例.属性=值的时候调用__setattr__(self,key,value)方法,即新建或者修改时调用
  • 在这个方法内部,真正的把属性名和值 写入到对应的方法内
  • 这个比上面那个方法更安全一些,
class A():
    def __init__(self, ax, bx):
        self.a = ax
        self.b = bx

    def f(self):
        print(self.__dict__)

    def __getattr__(self, name):
        print("__getattr__", name)

    def __setattr__(self, name, value):
        print("__setattr__", name, value)
        #加入这一行就限制属性为只读属性,能添加,添加之后就不能更改
        if name == 'c' and name in self.__dict__.keys():
            print("此属性为只读属性,")
        else:
            self.__dict__[name] = value

a = A(1, 2)
a.f()
a.x
a.x = 3
a.f()
a.c = 10
a.c = 20
a.f()


结果

__setattr__ a 1
__setattr__ b 2
{'a': 1, 'b': 2}
__getattr__ x
__setattr__ x 3
{'a': 1, 'b': 2, 'x': 3}
__setattr__ c 10
__setattr__ c 20
此属性为只读属性,
{'a': 1, 'b': 2, 'x': 3, 'c': 10}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值