29.私有属性

python的三大特性为:多态,继承和封装。

在封装时,把属性和方法都隐藏起来,不让别人去用。在python中可以使用私有属性来实现封装。

定义私有属性的方法:

在定义类时,给类中的属性前加一个__,该属性就变成类的私有属性,别的对象都无法调用查看,只有在该类中才能调用。

class Person:
    def __init__(self,name,sex):
        self.name=name
        self.__sex=sex   #创建一个私有属性
    def fun(self):
        return self.__sex   #在类中调用私有属性
a=Person('hello','man')
#print(a.sex)       #对象无法调私有属性
print(a._Person__sex)   #在类外以_类名__属性名调用属性
print(a.__dict__)
a.__high='1.85'   #在类外无法给类添加私有属性

如上代码:在类以外的对象无法调用私有属性

但是:

这只是一种代码级别的限制,实际上是可以通过_类名__属性名来查看和调用该属性,因为一旦定义私有属性,就会在内存中生成一个_类名__属性名形式的属性,只要在类的内部使用私有属性,实际上是自动调用_类名__属性名。
但是在类的外部给类中添加一个以__开头的属性,就不会是私有属性。

定义私有方法的方法:

在类中定义方法时,给方法名前添加__,该方法就是私有方法,在类外无法调用该方法。

class Person:
    __key=123     #定义私有静态属性,只有类内的属性可以调用
    def __init__(self,name,sex):
        self.name=name
        self.__sex=sex   #创建一个私有属性
    def fun(self):
        return self.__siyou_fun() #类内部调用私有方法
    def __siyou_fun(self):
        return 'hello world'
a=Person('hello','man')
print(a.fun())
# print(a.__siyou_fun())    #类外部无法调用私有方法

如上代码:在类外的对象无法调用类的私有方法。同时无法按照_类名__属性名的形式调用私有方法。

总结:在类中定义静态属性时,给属性前加__,该静态方法就是私有静态方法

父类的私有属性,私有方法,私有静态属性,在子类中也不能调用

class Room:
    __key='123'
class Son(Room):
    print(Room.__key)   #报错
   print(_Son_key) #这才能调用父类私有静态方法

 在Room类中,__key在内存中被改写为_Room__key,在Son类中,__key在内存中被改写为_Son__key,因此不能调用。

会用到私有这个概念的场景:

1.隐藏起一个属性,不想让类的外部调用
2.向保护这个属性,不想让属性随意改变
3.让子类无法继承这个属性

posted @ 2020-10-24 20:31  maday  阅读(222)  评论(0)    收藏  举报