Python私有化

私有化的含义

  • 私有化是为了实现更好的封装形式。能隐藏属性,不被随意修改。以前置双下划线__属性/方法名定义,但是结尾不能是双下划线。
  • 如果不让某些属性在类外部被随意更改,可设置成私有属性。
  • 在类定义的内部可以访问。
  • 在外部也可以通过较为复杂的方法:实例.__类名__属性名/方法名访问。

私有化的特性

  • 以双下划线开头(不以双下划线结尾)的私有化属性或者方法,可以在类里访问修改,类名.__属性/方法名形式。在类外不可以访问。
  • 子类不能继承私有化属性或方法。
# 子类不能继承私有化属性
class Person(object):
    def __init__(self):
        self.__age = 18     # 定义一个私有实例属性
    def get_age(self):
        return self.__age   # 访问私有实例属性
    def set_age(self, age):
        self.__age = age    # 修改私有实例属性
    def __test(self):
        print("-----Person, test---------")
        return self.__age  # 访问私有实例属性

class Student(Person):
    def get_age(self):
        print(self.__age)       # 报错,无法继承父类对象的__age属性
    def test(self):
        print(self.__test())    # 报错,无法继承父类对象的__test方法   
        
s1 = Student()
s1.get_age()
s1.test()
print(s1.__age)				# 报错,无法访问__age属性 

通过公有方法访问更改私有属性

  • 对私有化属性,也可以通过公有方法来访问或更改,在函数中还可以对属性进行判断等,更加灵活。
  • 一般命名为get_属性名,set_属性名。
class Student:
    def __init__(self, name, age):
        self.__name = name
        self.age = age
    def set_name(self, name):
        self.__name = name
    def get_name(self):
        return self.__name
s1 = Student("Lucy", 13)
print(s1._Student__name)
s1._Student__name = "Jim"
print(s1._Student__name)
s1.set_name("Hanmeimei")
print(s1.get_name())

result:
Lucy
Jim
Hanmeimei

@property装饰器

  • 将属性私有化后,再通过公有的方法对属性进行修改操作。这样的方法可以对属性的修改操作进行判断。但是比直接操作对象属性要麻烦一些。
  • @property装饰器,可以将私有属性的方法,变得跟操作普通对象属性一样方便。
# 相当于get函数
@property
def 变量名(self):
	return self.__变量名
	
# 相当于set函数
@变量名.setter
def 变量名(self):
	...
	self.__变量名 = value
	...
class Person():
    def __init__(self, name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, name):
        self.__name = name
p1 = Person("Tom")
p1.name = "Jim"     # 像普通属性一样访问
print(p1.name)

result:
Jim

单下划线私有含义

  • 单下划线_名字只是一种名称层面提醒这是个私有化的属性或者方法,让程序员注意,但实际上用法和共有的相同。
  • 单下划线或双下划线加名字在from… import *中不能导入。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值