7-2 封装和反射

封装

1 【封装是什么】

隐藏对象的属性和实现细节,仅对外提供公共访问方式。

2【好处】

1. 将变化隔离;

2. 便于使用;

3. 提高复用性;

4. 提高安全性;

【封装原则】

1. 将不需要对外提供的内容都隐藏起来;

2. 把属性都隐藏,提供公共方法对其访问。

二 私有变量和私有方法

在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

三 实例

1 私有变量

#私有属性
# class Person():
#     __country='中国'
#     print(__country)
# print(Person.__dict__)
# print(Person._Person__country) # 不能使用这种方式去调用私有的变量
# #私有的名字,只能在类的内部使用,不能在类的外部使用
# Person.__name='XXX' #在类的外部不能定义私有变量
# print(Person.__name)
# print(Person.__dict__)

2私有方法

 1 # 在类的内部 如果使用__变量的形式会发生变形,python会自动的为你加上_类名
 2 # class Person():
 3 #     __country='中国' #私有的静态属性
 4 #     def __init__(self,name,pwd):
 5 #         self.name=name
 6 #         self.__pwd=pwd #私有的对象属性
 7 #     def login(self):
 8 #         print(self.__dict__)
 9 #         if self.name=='alex' and self.__pwd=='alex3714':
10 #             print('登录成功')
11 # alex=Person('alex','alex3714')
12 # alex.login()
13 # print(alex.__dict__)

总结

# 静态属性 、 对象属性、 方法(动态属性) 前面加上双下划綫都会变成私有的
# 私有的特点就是只能在类的内部调用,不能在类的外部使用

反射


一 概念

# 什么叫反射
# 通过字符串数据类型的 变量名 来访问变量的值

2 反射的四种类型

# 类名 反射 静态属性
# 对象名 反射 对象属性 和 方法
# 模块 反射 模块中的名字
# 反射 自己所在文件中的名字
# x.y 这样的形式 都可以用反射

3实例

1)类名 反射 静态属性

 1 # class Person:
 2 #     role='Person'
 3 #     def __init__(self,name):
 4 #         self.name=name
 5 #     def eat(self):print('eating')
 6 #     def drink(self):print('drinking')
 7 #
 8 # alex=Person('alex')
 9 # print(alex.name) #正常的获取
10 # #
11 # # print(getattr(alex,'name')) #利用反射获取 对象反射对象属性
12 # #
13 # # print(getattr(Person,'role')) #类名反射静态属性

2)

1 # 模块 反射 模块中的名字
2 #自己先建个一个py文件即模块 mymodules.py
3 4 # import mymodules 5 # mymodules.func1() 6 # getattr(mymodules,'func1')() #反射模块中的方法 7 # # print(mymodules.money) 8 # print(getattr(mymodules,'money')) #反射模块中的静态属性


3)

#调用模块中的类方法
# Manager=getattr(mymodules,'Manager')
# a=Manager()
# a.eat()

4)

1 # 反射 自己所在文件中的名字
2 import sys
3 # value='123'
4 # print(sys.modules['__main__']) #打印自己文件所在的路径
5 # print(getattr(sys.modules['__main__'],'value'))

#总结:
# 首先 使用getattr取获取一个名字,如果在这个对象的命名空间中没有这个名字 会报错
# getattr的反射好伴侣 hasattr
# 如果使用getattr取获取一个方法,那么只能拿到这个方法的内存地址 加上括号就是执行,当然,括号里的参数可以照传不误
# 如果getattr获取一个属性,那么直接使用反射就可以获取到值 如:print(getattr(alex,'name'))

三 __new__ 构造方法,创建一个对象

1 # class Foo:
2 #     def __new__(cls,*args,**kwargs):#cls是类,因为这时候self还么有
3 #         print('执行我了')
4 #         obj=object.__new__(cls) #这个就是self
5 #         print(obj)
6 #         return obj
7 #     def __init__(self):
8 #         print('2222222',self)
9 # Foo()
#总结
# 先执行new方法,object.new()
# 再执行init

#具体的执行过程
# Foo() --> python解释器接收到你的python代码
# python解释器替你去做了很多操作
# 包括 主动帮助你 调用 new方法 去创造一个对象 —— 开辟内存空间 —— python语言封装了开辟内存的工作
# object的new方法里 —— 帮你创造了对象
# 调用init用到的self参数 就是new帮你创造的对象
原文地址:https://www.cnblogs.com/huningfei/p/9084344.html