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)
浙公网安备 33010602011771号