Python学习笔记【week03day2下】封装,语法糖--@property,黑魔法,Python中的下划线

封装,语法糖--@property,黑魔法,Python中的下划线

  • 封装
  • 语法糖
  • 黑魔法
  • Python中的下划线

封装

面向对象的三大特征:封装,继承以及多态

  • 广义的封装:类与函数的定义就是封装的体现。
  • 狭义的封装:类中的有些属性我们不希望外界能够直接访问,我们可以将这些属性
  • 进行私有化只有本类持有,再给外界暴露出一个访问的接口即可。
  • 封装的本质:属性私有化的过程
  • 封装的优点:提高数据的复用性,保证数据的安全性

私有化: self.__age

def __init__(self,age):
    self.__age = age
  • 需要通过setter和getter方法来调用该私有变量
  • 对于私有化的属性我们可以对它进行数据过滤

语法糖

@property功能:可以将函数转为属性来进行调用
将@property添加给getter头上,将getter变成一个属性来进行调用
与此同时,@property还会生成一个新的装饰器,这个装饰器的名字叫做
@属性.setter的装饰器,这个装饰器可以将setter方法变为属性赋值。
优点:方便调用者写出更加简洁的代码。

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

#语法糖(可将函数转为属性来进行调用)
@property  # getter方法
def age(self):
    return self.__age

#前面一定要有getter方法,因为这是语法糖-@property产生的一个新的装饰器:@属性.setter
@age.setter
def age(self,age):
    if age < 0 or age > 160:
        print("超出年龄范围")
    else:
        self.__age = age

黑魔法

为什么外部无法访问私有变量?
self.__age = age

  • 因为解释器将私有变量“__属性名”转换成了“_类名__属性名”
  • 因此我们直接使用对象.__属性名是访问不到的
  • 可以用 “对象._类名__属性名” 来进行访问,但不推荐
class Father():

	def __init__(self,name,money):
		#成员变量
    	self.name = name
    	#私有变量
    	self.__money = money

if __name__ == '__main__':
	#实例化
	fa = Father("马爸爸",100)
	#黑魔法(不推荐使用)
	print(fa._Father__money)

Python中的下划线

__foo__  首尾双下划线,这个定义的时候使用,自己定义变量的时候也不报错。
__foo   首双下划线,私有类型,访问范围,在类本身可以访问
_foo   首单下划线,保护类型的,虽然可以直接访问,但是建议将视为私有变量来进行访问。

你可能感兴趣的:(Python学习篇)