隐藏属性以及property装饰器

隐藏属性

  1、如何隐藏

     再要隐藏的数据前面加__即可

  2、隐藏属性注意点

     1、在类定义阶段,发生了语法上的变形(变为_类名__属性名)

     2、隐藏对外不对内

        3、只有在定义阶段发生变形,其他情况都不发生变形了

  3、为什么要隐藏

    1、类里面的隐藏属性,类外部可以使用,但是目的不是让类外部使用的,类外部如果想要使用,在类内部开放接口继续宁访问

    2、可以达到对外部数据的严格控制

  4、代码演示

class Student():
    __school = 'SH' # _Student__school  => _类名__属性名
    def __init__(self, name, age):
        self.__name = name
        self.age = age

    def __tell_info(self):  # _Student__tell_info  => _类名__函数名
        print('name: %s, age: %s' % (self.__name, self.age))

    def get_school(self):
        return self.__school  # self._Student__school

    def set_school(self, v):
        if type(v) is not str:
            print('数据类型不合法')
        # if isinstance(v, str):
            return
        self.__school = v

property装饰器

  1、作用

      就是把方法伪装成属性

  2、代码演示

class Student():
    __school = 'SH'  # _Student__school  => _类名__属性名

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

    def __tell_info(self):  # _Student__tell_info  => _类名__函数名
        print('name: %s, age: %s' % (self.__name, self.age))

    @property  # 把方法伪装成属性
    def name(self):
        return "name:%s" % self.__name

    @name.setter
    def name(self, v):
        if type(v) is not str:
            print('数据类型不合法')
        # if isinstance(v, str):
            return
        self.__name = v

    @name.deleter
    def name(self):
        print('不让删')

stu = Student('ly', 18)
print(stu.get_name())

stu.name = 123
print(stu.name)

del stu.name

  3、练习

    BMI指数:计算公式如下

体质指数(BMI)=体重(kg)÷身高^2(m)
EX:70kg÷(1.75×1.75)=22.86
class Bmi():
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight

    @property
    def get_bmi(self):
        return self.weight / (self.height ** 2)

bmi = Bmi(1.8, 70)
print(bmi.get_bmi)

  4、扩展

    property也可以这样使用

class Student():
    __school = 'SH'  # _Student__school  => _类名__属性名

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

    def __tell_info(self):  # _Student__tell_info  => _类名__函数名
        print('name: %s, age: %s' % (self.__name, self.age))

    def get_name(self):
        return "name:%s" % self.__name

    def set_name(self, v):
        if type(v) is not str:
            print('数据类型不合法')
            # if isinstance(v, str):
            return
        self.__name = v

    def del_name(self):
        print('不让删')
    
    # 了解
    name = property(get_name, set_name, del_name)


stu = Student('ly', 18)
# print(stu.xxx)

stu.name = 'aaa'
print(stu.name)

 

 

    

posted @ 2021-12-03 16:42  那就凑个整吧  阅读(96)  评论(0)    收藏  举报