目录

  • day 26 /反射,双下方法

    • 目录
    • 1.元类type
    • 2.反射
    • 3.函数与类的区别
    • 4.特殊的双下方法

day 26 /反射,双下方法

目录

1.元类type

type:获取对象从属的类Python中一切皆对象,类在某种意义上也是一个对象Python中自己定义的类,以及大部分内置类,都是由type元类(构建类)实例化得来的
# print(type('abc'))
# print(type([1,2,3]))
# print(type((22,33)))
#
# # type 获取对象从属于的类
# print(type(A))
# print(type(str))
# print(type(dict))
type与object的关系:object类是type类的一个实例 print(type(object))object类是type类的父类 print(issubclass(type,object))

2.反射

程序对自己内部代码的一种自省方式
反射是什么:通过字符串操作对象的方式
实例对象,类,本模块,其他模块
内置函数:hasattr  getattr setattr delattr   (attr 是属性的意思)
hasattr: 判断有无属性
# class A:
#     country = '中国'
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#     def func(self):
#         print('in A func')
# obj = A('二狗',47)# hasattr
# print(hasattr(obj,'name'))
# print(hasattr(obj,'country'))
# print(hasattr(obj,'func'))getattr: 获取属性
# print(getattr(obj,'name'))
# print(getattr(obj,'func'))
# f = getattr(obj,'func')
# f()
# print(getattr(obj,'sex',None))
# if hasattr(obj,'name'):
#     getattr(obj,'name')setattr: 设置属性
delattr: 删除属性
# setattr,delattr 用的很少
# obj.sex = '公'
# print(obj.sex)
# setattr(obj,'sex','公')
# print(obj.__dict__)
# delattr(obj,'name')
# print(obj.__dict__)# 从类的角度:
# class A:
#     country = '中国'
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#     def func(self):
#         print(self)
#         print('in A func')
# # if hasattr(A,'country'):
# #     print(getattr(A,'country'))
#
# if hasattr(A,'func'):
#     obj = A('二狗', 26)
#     getattr(obj,'func')()
#     getattr(A,'func')(obj)# 从其他模块:
# import tbjx
# print(getattr(tbjx,'name'))
# getattr(tbjx,'func')()
#import tbjx
# 1. 找到tbjx对象 的C类,实例化一个对象.
# print(getattr(tbjx,'C'))
# obj = getattr(tbjx,'C')('123')
# 2. 找到tbjx对象 的C类,通过对C类这个对象使用反射取到area.
# print(getattr(tbjx.C,'area'))
# 3. 找到tbjx对象 的C类,实例化一个对象,对对象进行反射取值.
# obj = getattr(tbjx,'C')('赵海狗')
# print(obj.name)
# print(getattr(obj,'name'))
# 从当前模块研究反射:
# a = 666
#
# def func1():
#     print('in 本模块这个对象')# def func1():
#     print('in func1')
#
# def func2():
#     print('in func2')
#
# def func3():
#     print('in func3')
#
# def func4():
#     print('in func4')# # func1()
# # func2()
# # func3()
# # l1 = [func1,func2,func3,func4,]
# import sys
# # # print(sys.modules[__name__])
# # print(getattr(sys.modules[__name__],'a'))
# # getattr(sys.modules[__name__],'func1')()
# # getattr(sys.modules[__name__],'func2')()
# # getattr(sys.modules[__name__],'func3')()
#
# func_lst = [f'func{i}' for i in range(1,5)]
# # print(func_lst)
# for func in func_lst:
#     getattr(sys.modules[__name__],func)()# class User:
#     def login(self):
#         print('欢迎来到登录页面')
#
#     def register(self):
#         print('欢迎来到注册页面')
#
#     def save(self):
#         print('欢迎来到存储页面')
#
# choose_dic = {
#     1: User.login,
#     2: User.register,
#     3: User.save,
# }
#
# while 1:
#     choose = input('请输入序号: \n1: 登录\n2: 注册\n3: 存储').strip()
#     obj = User()
#     choose_dic[int(choose)](obj)# class User:
#
#     user_list = [('login','登录'),('register','注册'),('save', '存储')]
#
#     def login(self):
#         print('欢迎来到登录页面')
#
#     def register(self):
#         print('欢迎来到注册页面')
#
#     def save(self):
#         print('欢迎来到存储页面')
#
#
# while 1:
#     choose = input('请输入序号: \n1: 登录\n2: 注册\n3: 存储\n').strip()  # 1
#     obj = User()
#     getattr(obj, obj.user_list[int(choose)-1][0])()  # getattr(obj,'login')

3.函数与类的区别

1.通过打印函数名的方式,区别什么是方法,什么是函数通过类名调用类中的实例方法叫函数通过对象调用类中的实例方法叫方法
# def func1():
#     pass
# class A:
#     def func(self):
#         pass
# print(func1)
# print(A.func)
# obj = A()
# print(obj.func)
2.可以借助模块判断类中的是方法还是函数
# from types import FunctionType
# from types import MethodType
# def func():
#     pass
# class A:
#     def func(self):
#         pass
# obj = A()
# print(isinstance(func,FunctionType))  # True
# print(isinstance(A.func,FunctionType))  # True
# print(isinstance(obj.func,FunctionType))  # False
# print(isinstance(obj.func,MethodType))  # True
3.函数都是显性传参,方法都是隐形传参
# class A:
#     @classmethod
#     def func(cls,a):
#         pass
#     @staticmethod
#     def func1():
#         pass
# A.func(222)
# A.func()
# obj = A()
# obj.func()

4.特殊的双下方法

特殊的双下方法: 原本是开发python这个语言的程序员用的.源码中使用的.
str : 我们不能轻易使用.慎用.
双下方法: 你不知道你干了什么就触发某个双下方法.
1.__len__   :len(b)执行b类从属父类的__len__方法,必须要有return int(返回值)# class B:
#
#     def __init__(self,name,age):
#         self.name = name
#         self.age =age
#
#     def __len__(self):
#         print(self.__dict__)
#
#         return len(self.__dict__)  # 2
#
# b = B('ergou',28)
#
# print(len(b))# dict
# print(len({'name': 'leye', 'age': 28}))2.__hash__
# class A(object):
#     pass
# obj = A()# print(hash(obj))
# str
# print(hash('fdsaf'))3.__str__(***) 里边必须有return "字符串"类型  (优先级高于__repr__)1.打印对象的时候,会触发__str__方法2.直接str转化也可以触发
# class A:
#
#     def __init__(self,name,age):
#         self.name = name
#         self.age =age
#
#     def __str__(self):
#         print(666)
#         return f'姓名: {self.name} 年龄: {self.age}'
#
# a = A('二狗',35)
# b = A('大狗',56)
# c = A('老狗',18)
# 打印对象触发__str__方法
# print(f'{a.name}  {a.age}')
# print(f'{b.name}  {b.age}')
# print(f'{c.name}  {c.age}')
# print(a)
# print(b)
# print(c)
# 直接str转化也可以触发.
# print(str(a))4.__repr__  里边必须有return "字符串"类型打印对象的时候,会触发__str__方法
# repr
# print('我叫%s' % ('alex'))
# print('我叫%r' % ('alex'))
# print(repr('fdsaf'))# class A:
#
#     def __init__(self,name,age):
#         self.name = name
#         self.age =age
#
#     def __repr__(self):
#         print(666)
#         return f'姓名: {self.name} 年龄: {self.age}'
#
# a = A('二狗',35)
# b = A('大狗',56)
# c = A('老狗',18)
# # print(a)
# print(repr(a))# class A:
#
#     def __init__(self,name,age):
#         self.name = name
#         self.age =age
#
#     def __str__(self):
#         return '777'
#
#
#     def __repr__(self):
#         return '666'
#
# a = A('二狗',35)
# b = A('大狗',56)
# c = A('老狗',18)
# # print(a)
# print(a) 5.__call__(***)  对象()触发对象从属类(父类)的__call__方法
# class Foo:
#
#     def __init__(self):
#         pass
#
#     def __call__(self, *args, **kwargs):
#         print('__call__')
#
# obj = Foo()
# obj()6.__eq__   return True/false(可以返回数字,字符串 一般返回布尔值)
# class A(object):
#     def __init__(self):
#         self.a = 1
#         self.b = 2
#
#     def __eq__(self,obj):
#         # if  self.a == obj.a and self.b == obj.b:
#         #     return True
#         return True
# x = A()
# y = A()
# print(x == y)
# x = 1
# y = 2
# print(x+y)7.__del__ 析构方法 回收对象时触发__del__方法
# class A:
#
#     def __del__(self):
#         print(666)
#
# obj = A()
# del obj8.__new__(***) new一个对象(构造方法)
对象是object类的__new__方法,产生了一个对象
# class A(object):
#
#     def __init__(self):
#
#         self.x = 1
#         print('in init function')
#
#     def __new__(cls, *args, **kwargs):
#         print('in new function')
#         return object.__new__(A)  # object 342534# # 对象是object类的__new__方法 产生了一个对象.
# a = A()# 类名()
# 1. 先触发 object的__new__方法,此方法在内存中开辟一个对象空间.
# 2. 执行__init__方法,给对象封装属性.# print(a)
def __init__(self):(不能写返回值,因为__new__已经有返回值了,不能同时接收两个返回值,只能接收__new__的返回值)9.单例模式  (主要优点就是节省内存)  (***)(手写一个单例模式)
Python的设计模式:单例模式一个类只允许实例化一个对象
class A:__instance = Nonedef __new__(cls,*args,**kwargs):cls.__instance = object.__new__(cls)return cls.__instance
a = A()
print(a)
b = A()
print(b)
c = A()
print(c)
三个实例化的地址相同
只是调用类中的方法,并不是去封装属性的时候,可以使用
方便对实例个数的控制,并节省系统资源9.__item__系列(4个)
__getitem__ __setitem___ __delitem__ 对对象做类似于字典的(增删改查)触发__item__系列
__delattr__ del obj.属性  就会触发此方法
# class Foo:
#     def __init__(self,name):
#         self.name=name## def __getitem__(self, item):#     # print(item)#     # print(666)#     return self.__dict__[item]# def __setitem__(self, key, value):#     # self.__dict__[key]=value#     print(key)#     print(value)# def __delitem__(self, key):#     print('del obj[key]时,我执行')#
#     def __delattr__(self, item):
#         super().__delattr__(item)
#         print(f'对象的{item}属性已经删除')
#
#
# f1=Foo('sb')
# print(f1['name'])
# f1[1] = 2
# f1['age']
# del f1[1]# del f1.name
# print(f1.name)# f1['age']=18
# f1['age1']=19
# del f1.age1
# del f1['age']
# f1['name']='alex'
# print(f1.__dict__)10.__enter__ __exit__ with 上下文管理(2个)
# class A:
#
#     def __init__(self,name):
#         self.name = name
#
#     def __enter__(self):
#         print(666)
#
#     def __exit__(self, exc_type, exc_val, exc_tb):
#         print(777)
# # obj = A('二狗')
# # 实例化对象的第二种方式: 必须基于 __enter__ 以及 __exit__这个两个方法.
# with A('二狗') as obj:
#     print(obj.name)# class A:
#
#     def __init__(self, text):
#         self.text = text
#
#     def __enter__(self):  # 开启上下文管理器对象时触发此方法
#         self.text = self.text + '您来啦'  # 第一步
#         print(11111)
#         return self  # 必须!!!将实例化的对象返回f1
#
#     def __exit__(self, exc_type, exc_val, exc_tb):  # 执行完上下文管理器对象f1时触发此方法
#         print(333)  # 第三步
#         self.text = self.text + ',这就走啦'
#
#
# with A('大爷') as f1:
#     print(2222)
#     print(f1.text)  # 第二步
# print(f1.text)  # 第四步11.__iter__  for 循环会触发此方法
# class A:
#
#     def __init__(self,name):
#         self.name = name
#
#     def __iter__(self):
#         for i in range(10):
#             yield i
#
#
#     # def __next__(self):
#     #     pass
# obj = A('二狗')  # obj 一个可迭代对象
# # print('__iter__' in dir(obj))
# # for i in obj:
# #     print(i)
#
# # print(obj.name)
# o = iter(obj)
# print(next(o))
# print(next(o))
# print(next(o))
# print(next(o))
# print(next(o))
# print(next(o))

转载于:https://www.cnblogs.com/liubing8/p/11335637.html

Python面向对象06/反射/双下方法相关推荐

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

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

  2. Python面向对象反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  3. Python 第二十六章 面向对象 元类+反射+双下方法

    元类 class A:pass obj = A() print(type('abc')) print(type([1,2,3])) print(type((22,33)))# type 获取对象从属于 ...

  4. python中常见的双下方法_python中常见的双下方法_python面向对象(5)__特殊双下方法...

    双下方法 双下方法是开发python这个语言程序员用的,源码中使用的. 我们不能轻易使用双下方法.可能重新写object的源码,慎用!!! 双下方法特征:你不知道干啥了,就会触发某个双下方法 len ...

  5. Python之面相对象 - 双下方法

    双下方法 定义:双下方法是特殊方法,他是解释器提供的 由爽下划线加方法名加双下划线 __方法名__的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但 ...

  6. 06 面向对象之:反射,双下方法

    一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语 ...

  7. python之面向对象反射和双下方法

    面向对象之反射,双下方法 反射 定义:主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中一切皆对象(都 ...

  8. Python面向对象中反射和双下的正确用法

    一.反射 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性 python中的一切事物都是对象(都可以使用反射) 四个可 ...

  9. 面向对象之: 反射和双下方法

    目录 一, 反射 二, 函数VS方法 三, 双下方法 一, 反射 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性 p ...

最新文章

  1. Java编程基础-运算符
  2. 成功解决ValueError: column index (256) not an int in range(256)
  3. nodejs之async异步编程
  4. Windows10+PicGo+七牛云+Typora搭建写作环境与图床
  5. asp.net微软图表控件MsChart
  6. 并行程序调试、测试与模型检测
  7. 用计算机改手机电量,三分钟更换iPhone 6虚标电池,老手机又焕发青春了
  8. 华为hcna认证有哪些优势?华为hcna认证好考吗?
  9. MATLAB | 老版本也能用,默认设置让简单的代码画出炫酷的图像
  10. SL400在win7系统下硬盘安装Mac OS
  11. Java 字符串长度不足,后面补0
  12. 华为交换机端口vlan详解
  13. 随机生成器,从给定列表中随机抽取一个元素
  14. jscriptbug
  15. 几个问题帮你认识“NIC”----网卡
  16. LC - P03 机器人大冒险
  17. linux远程连接硬件加速,Linux中为谷歌Chrome浏览器启用视频硬件加速的方法
  18. python基础知识大一总结与反思_反思总结及规划 其一
  19. 数据结构-排序算法总结与感悟
  20. 博士年薪25万,副教授30万,招138人,省会城市高校

热门文章

  1. Android获取当前连接的wifi名称
  2. sql 闩锁 原因_如何识别和解决SQL Server中的热闩锁
  3. 貂蝉待你玩转Java王者荣耀
  4. 从Mac的GUID分区谈起
  5. word表格分开快捷键_在Word2010表格的编辑中,快速的拆分表格应按()快捷键。
  6. couldn't create PTY
  7. HTML的div作用
  8. scanf ---------未完待续
  9. 行政区划代码2020(SQL)--(下)
  10. LiveData详解