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帮你创造的对象

 

posted @   huningfei  阅读(221)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
levels of contents
点击右上角即可分享
微信分享提示