文章目录
一、封装&
面向对象的三大特征:封装,继承和多态
广义的封装:函数的定义和类的定义
狭义的封装:在面向对象中,一个类中的某些属性,如果不希望被外界直接访问,则可以将该属性私有化,该属性只能在当前类中被直接访问,如果在类的外面需要访问【获取或修改】,则可以通过暴露给外界的函数间接访问
封装的本质:将类中的属性进行私有化
1.私有属性
# 1.属性未被私有化
class Person1():
def __init__(self,name,age):
# 公开属性
self.name = name
self.age = age
def show(self):
print(f"姓名:{
self.name},年龄:{
self.age}")
p1 = Person1('张三',10)
# 在类的外面可以直接访问
print(p1.name,p1.age) # 获取
p1.show()
p1.name = 'jack' # 修改
p1.age = 20
print(p1.name,p1.age)
p1.show()
print("*" * 30)
# 2.属性被私有化
class Person2():
def __init__(self,name,age):
# 私有属性:只需要在属性名的前面添加两个下划线
self.__name = name
self.__age = age
def show(self):
print(f"姓名:{
self.__name},年龄:{
self.__age}")
p2 = Person2('张三',10)
p2.show()
# 注意:一个属性一旦被私有化,只能在类的内部被访问,在类的外面无法直接访问,
# 直接访问:对象.属性
# print(p2.__name,p2.__age)
"""
工作原理:属性被私有化之后,私有属性在内存中可能以另外一种形式存在,常见形式:_类名__属性名
但是,不建议使用,因为在不同的系统中,不同的版本下,存在形式可能不同,违反了Python跨平台的特点
"""
# print(p2._Person2__name)
# 3.暴露给外界的函数
class Person3():
def __init__(self,name,age):
self.__name = name
self.__age = age
def show(self):
print(f"姓名:{
self.__name},年龄:{
self.__age}")
# 修改
def set_name(self,name):
self.__name = name
# 获取
def get_name(self):
return self.__name
def get_age(self):
return self.__age
def set_age(self,age):
if age < 0:
age = 0
self.__age = age
p3 = Person3('李四',12)
print(p3.get_name()) # print(p1.name,p1.age)
p3.set_name('jack') # p1.name = 'jack'
print(p3.get_name())
print(p3.get_age())
p3.set_age(18)
print(p3.get_age())
print("*" * 50)
# 4.@property
"""
@property:修饰某个函数,该函数会被当做属性使用,该函数的函数名相当于是一个变量名,指向该函数的返回值
作用:在私有属性的使用中,为了获取私有属性的值
@xxx.setter:修饰某个函数,该函数会被当做属性使用,xxx必须和被@property装饰的函数名相同
作用:在私有属性的使用中,为了给私有属性修改值
注意:为了提高代码的可读性,同一个私有属性暴露给外界的函数名建议同名,使用私有属性的属性名
"""
class Person4():
def __init__(self,name,age):
self.__name = name
self.__age = age
def show(self):
print(f"姓名:{
self.__name},年龄:{
self.__age}")
# 获取
@property
def name(self):
return self.__name
# 修改
@name.setter
def name(self,name):
self.__name