1. 私有属性/方法/静态属性 -> 只有在类的内部才能使用

  • 私有化的作用就是一些属性/方法/静态属性只想在内部使用,不想在外不可以被使用到,例如:密码 密钥

  • 私有属性 -> __属性名

class Person:
    def __init__(self, name, password):
        self.name = name
        self.__password = password  # 定义私有属性

    def p_fn(self):
        print(self.__password)  # 在类的内部调用私有属性

p = Person('Kevin', 123)
p.p_fn()
# print(p.password) 在外部无法调用私有属性

  • 私有方法 -> __方法名

class Person:
    def __init__(self, name, password):
        self.name = name
        self.__password = password

    def __private_fn(self):  # 定义私有方法
        print(self.__password)

    def p_fn(self):
        self.__private_fn()  # 在类的内部调用私有方法

p = Person('Kevin', 123)
p.p_fn()

  • 私有静态属性 -> __私有静态属性名

class Person:
    __key = '密钥'  # 定义私有静态属性

    def __init__(self, name, password):
        self.name = name
        self.__password = password

    def p_fn(self):
        print(Person.__key)  # 调用私有静态属性

p = Person('Kevin', 123)
p.p_fn()

2. _类名__私有属性名/方法名/静态属性名 -> 在外部调用私有属性/方法/静态属性 -> 在开发的过程中不要这么做

class Person:
    __key = '密钥'

    def __init__(self, name, password):
        self.name = name
        self.__password = password

    def __private_fn(self):
        print(self.__password)

    def p_fn(self):
        self.__private_fn()

p = Person('Kevin', 123)
print(p.__dict__)  # {'name': 'Kevin', '_Person__password': 123}
print(p._Person__password)  # 在外部获取私有属性
p._Person__private_fn()  # 在外部调用私有方法
print(p._Person__key)  # 在外部调用私有静态属性

3. 在子类无法调用父类的私有属性 -> 保护父类属性不被子类调用    

class Father:
    def __int__(self):
        self.__attr = '父级的私有属性'

class Child(Father):
    def fn(self):
        print(self.__attr) # 无法调用父级的私有属性

c = Child()
c.fn()

4. 在 C++ 中的类所有属性都会定义为私有属性,属性的获取和修改都通过方法实现,且可以在修改属性的方法中加上限制,有效实现属性不会被随意修改

class Room:
    def __init__(self, name, length, width):
        self.__name = name
        self.__length = length
        self.__width = width

    def getName(self):
        return self.__name

    def editName(self, new_name):
        if type(new_name) is str and new_name.isdigit() == False:  # 判断是否为字符串,且字符串不是由数字组成的
            self.__name = new_name
        else:
            print('不合法姓名')

    def area(self):  # 计算面积且长宽不暴露出去
        return self.__length * self.__width

r = Room('Kevin', 100, 20)
print(r.area())  # 2000
print(r.getName())  # Kevin
r.editName('Yeung')
print(r.getName())  # Yeung