私有化的含义
- 私有化是为了实现更好的封装形式。能隐藏属性,不被随意修改。以前置双下划线__属性/方法名定义,但是结尾不能是双下划线。
- 如果不让某些属性在类外部被随意更改,可设置成私有属性。
- 在类定义的内部可以访问。
- 在外部也可以通过较为复杂的方法:实例.__类名__属性名/方法名访问。
私有化的特性
- 以双下划线开头(不以双下划线结尾)的私有化属性或者方法,可以在类里访问修改,类名.__属性/方法名形式。在类外不可以访问。
- 子类不能继承私有化属性或方法。
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)
def test(self):
print(self.__test())
s1 = Student()
s1.get_age()
s1.test()
print(s1.__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装饰器,可以将私有属性的方法,变得跟操作普通对象属性一样方便。
@property
def 变量名(self):
return self.__变量名
@变量名.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 *中不能导入。