18.面向对象【二】

【一】面向对象的三大特性

封装,继承,多态

  • 封装
    • 概念:将数据与功能整合到一起
    • 作用:保护隐私
    • 方法:在变量名前加__

【二】隐藏属性

1)数据属性

class School(object):
    # 隐藏属性
    __school_name = 'xx学校'
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def read(self):
        print('read book')
st1 = School(name='a', age=20)
print(st1._School__school_name) # xx学校

2)函数属性

class School(object):
    school_name = 'xx学校'
    def __init__(self, name, age):
        self.name = name
        self.age = age
    # 隐藏函数
    def __read(self):
        return f'{self.name} in process of read book'
st1 = School(name='a', age=20)
print(st1._School__read()) # a in process of read book

3)补充

  • 变形只发生在类初始化得到对象的时候,且只发生一次
class School(object):
    __school_name = 'XX学校'
    def __init__(self, name):
        self.name = name
    def __read(self):
        return f'{self.name} in process of read book'
st1 = School(name='a')
# 相当于单独添加了一个字典
st1.__school_name_new = 'XX院校'
print(st1.__dict__)  # {'name': 'a', '__school_name_new': 'XX院校'}
print(st1._School__school_name)  # XX学校
print(st1.__school_name_new)  # XX院校

【三】开发接口

1)隐藏数据属性

1.不符合要求会抛出异常

class School(object):
    school_name = 'XX学校'
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def age_(self):
        if int(self.age) < 0:
            raise TypeError(f'{self.name}未出生')
        print(f'{self.name}现在{self.age}岁')
st1 = School(name='a', age=20)
st1.age_()  # a现在20岁
st2 = School(name='b',age=-10)
st2.age_()  # 报错(b未出生)

2.符合要求修改完成

class School(object):
    school_name = 'XX学校'
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def age_(self,new_age):
        self.age = int(new_age)
st1 = School(name='a', age=20)
print(st1.__dict__)  # {'name': 'a', 'age': 20}
st1.age_(new_age=25)
print(st1.__dict__)  # {'name': 'a', 'age': 25}

2)隐藏函数属性

class School(object):
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade
    def __age(self):
        print(f'{self.name}年龄为{self.age}')
    def __grade(self):
        print(f'{self.name}成绩为{self.grade}')
    def message(self):
        self.__age()
        self.__grade()
st1 = School(name='a', age=20, grade=90)
st1.message()  
# a年龄为20
# a成绩为90

【四】装饰器property

1)概念

一种特殊的属性,将函数的返回值作为数据属性返回

class School(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    @property
    def message(self):
        return f'{self.name}年龄为{self.age}'
st1 = School(name='a', age=20)
print(st1.message)  # a年龄为20

2)面向对象的三种封装方式

  • public
    • 不封装,对外公开
  • protected
    • 不对外公开,内部可查看
  • private
    • 不开放,任何人无权查看
class School(object):
    def __init__(self, name):
        self.__name = name
    # 添加装饰器,将当前函数名作为一个数据属性返回
    @property
    def new_name(self):
        return self.__name
    # 修改
    @new_name.setter
    def new_name(self, name_):
        self.__name = name_
    # 删除
    @new_name.deleter
    def new_name(self):
        del self.__name
st1 = School(name='a')
# 查看
print(st1.new_name)
# 修改
st1.new_name = 'b'
print(st1.new_name)
posted on 2024-05-06 16:43  晓雾-Mist  阅读(10)  评论(0)    收藏  举报