类与对象的封装

一、隐藏属性

    什么是隐藏属性?

      1.在函数定义阶段使用__来隐藏属性,使属性发生了语法上的变形,变成了_类名__属性名

      2.属性的隐藏对内不对外

      3.只有在函数定义阶段会发生变形,其他阶段__不会发生变形

        

class Person:
    __country = "China"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod
    def create_id():
        import uuid
        return uuid.uuid4()


p = Person('laowang', 18)
# 可以看到隐藏后里面的属性名变成了_Person__country
print(Person.__dict__)  # {'__module__': '__main__', '_Person__country': 'China', '__init__': <function Person.__init__ at 0x000001BDD860BB70>, 'create_id': <staticmethod object at 0x000001BDD8449470>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}

print(Person.country)  # 报错 在外部无法用原来的属性名取值了

  

    为什么要隐藏属性?

      类里面的隐藏属性, 类外部可以使用,但是目的不是让类外部使用的,类外部要是想用,在类内部开放接口进行访问
      可以达到对外部数据的严格控制

class Person:
    __country = "China"

    def __init__(self, name, age):
        self.__name = name
        self.age = age

    def get_country(self):
        return self.__country

    def set_country(self, v):
        if isinstance(v, str):  # 对输入的值进行判断,如果输入错误的值则不修改
            self.__country = v
            return


p = Person('laowang', 18)


p.set_country('Chinse')
p.set_country(123)
print(p.get_country()) # Chinses

  

 

二、property装饰器

    property装饰器的作用就是将方法伪装成属性

    同时还提供设置添加修改和删除的功能的属性

class Person:
    __country = "China"

    def __init__(self, name, age):
        self.__name = name
        self.age = age

    @property
    def name(self):
        print('name:%s' % self.__name)

    @name.deleter  # 设置删除功能
    def name(self):
        del self.__name

    @name.setter  # 设置添加修改功能
    def name(self, v):
        if isinstance(v, str):  # 对输入的值进行判断,如果输入错误的值则不修改
            self.__name = v
            return


p = Person('laowang', 18)

p.name
p.name = 'laoxie'
p.name
del p.name
print(p.__dict__)

 

 

 

 

 

posted @ 2021-12-03 15:07  椰子皮0oo0  阅读(42)  评论(0)    收藏  举报
1