python 面向对象之:反射,双下方法

函数vs 方法

# 1 通过函数名可以大致判断
# print(func)  # <function func at 0x00000000005D1EA0> 函数
# obj = A()
# print(obj.func)  # <bound method A.func of <__main__.A object at 0x0000000001DE1CF8>> 方法

# 2. 通过types模块去验证
# from types import FunctionType #返回bool True就是函数
from types import MethodType
# 类名调用func 就是一个函数
# print(isinstance(A.func, FunctionType)) #True   函数
# 对象调用func 就是一个方法
# print(isinstance(obj.func, FunctionType))
# 对于静态方法的研究
# print(isinstance(A.f, FunctionType))

# 结论
# 1. 类⽅法.不论任何情况,都是⽅法.
# 2. 静态方法,不论任何情况.都是函数
# 3. 实例方法,如果是实例访问.就是⽅法.如果是类名访问就是函数.
# 函数与方法
# 函数: 全都是显性传参
# 方法: 存在隐性传参

反射

1.什么是反射?以及应⽤场景?(2分)
通过字符串的形式操作对象相关的属性。python中的⼀切事物都是对象(都可以使⽤反射)
# python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
# 从实例的角度去研究反射 可以使用
# getattr(obj,'func')()
# 从类的角度研究反射 可以使用
# getattr(A,'func')(obj)
# 从当前脚本研究反射 可以使用
# hasattr(this_module, 's1')
# 在其他模块研究反射 可以使用
# getattr(obj,'test')()

# 总结
# print(hasattr(obj,'name'))#查询 返bool 确认 有没有这个属性
# print(getattr(obj,'name','没有'))#查询 返回 对应属性值  加第3个参数 不会报错
# setattr(obj,'aa','aa')#增加属性   可以覆盖
# delattr(obj,'name')#删除属性

双下方法

# 总结
# 一个对象之所以可以使用len()函数,根本原因是这个对象从输入的类中有__len__方法,
# hash(obj) 会调用obj这个对象的类(基类)的__hash__方法
# print(str(obj))  # 会触发__str__
# print(obj)  # 打印输出实例会触发__str__
# # print('此对象为%s' %obj)  # 格式化输出会触发__str__
# # print(obj)  # 触发__repr__
# print('此对象是%r' %obj)  # 触发__repr__
# # print(obj) 先触发__str__方法
# __call__ 方法的执行是由对象后加括号触发的,而构造方法的执行是由创建对象触发的
# print(a == b)  # 对一个类的两个对象进行比较操作,就会触发__eq__方法
# __new__ 构造方法
# __new__创造并返回一个新对象.
# 类名() 先触发__new__ 并且将类名自动传给cls.
# __item__对对象进行类似于字典的操作
# 对一个对象类似于进行with语句上下文管理的操作, 必须要在类中定义__enter__ __exit__
# 单列模式
# 这个类的对象不是个性化的,主要是实例化对象之后去执行类中的方法.
# class A:
#     __instance = None
#
#     def __new__(cls, *args, **kwargs):
#         if not cls.__instance:
#             object1 = object.__new__(cls)
#             cls.__instance = object1
#         return cls.__instance
# obj = A()
# obj1 = A()
# obj2 = A()
# print(obj,obj1,obj2)

转载于:https://www.cnblogs.com/saoqiang/p/11377193.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值