博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 第二十六章 面向对象 元类+反射+双下方法
阅读量:5201 次
发布时间:2019-06-13

本文共 7032 字,大约阅读时间需要 23 分钟。

元类

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

反射

# 程序对自己内部代码的一种自省方式.# 反射是什么?  通过字符串去操作对象的方式.# 实例对象.# 类.# 本模块.# 其他模块.# hasattr,getattr, setattr, delattr# 实例对象:# 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'))# 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 用的很少# 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')

函数与方法

def func1():    passclass A:    def func(self):        pass# 1. 通过打印函数名的方式区别什么是方法,什么是函数. (了解)# 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# 总结:# python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,# 以及大部分内置类,都是由type元类(构建类)实例化得来的.# python 中一切皆对象, 函数在某种意义上也是一个对象,函数这个对象是从FunctionType这个类实例化出来的.# python 中一切皆对象, 方法在某种意义上也是一个对象,方法这个对象是从MethodType这个类实例化出来的.class A:    @classmethod    def func(cls,a):        pass    @staticmethod    def func1():        pass# A.func(222)# A.func()# obj = A()# obj.func()# 总结: 如何判断类中的是方法还是函数.# 函数都是显性传参,方法都是隐性传参.

双下方法

# 特殊的双下方法: 原本是开发python这个语言的程序员用的.源码中使用的.# str : 我们不能轻易使用.慎用.# 双下方法: 你不知道你干了什么就触发某个双下方法.# __len__# 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('leye',28)## print(len(b))# dict# print(len({'name': 'leye', 'age': 28}))# class A(object):##     pass## obj = A()# print(hash(obj))# str# print(hash('fdsaf'))# ***# 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))# 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)# __call__方法  ***# 对象() 自动触发对象从属于类(父类)的__call__方法# class Foo:##     def __init__(self):#         pass##     def __call__(self, *args, **kwargs):#         print('__call__')## obj = Foo()# obj()# __eq__# 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)# __del__析构方法# class A:##     def __del__(self):#         print(666)## obj = A()# del obj# __new__ *** 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)# python中的设计模式: 单例模式# 一个类只允许实例化一个对象.# class A:##     pass# obj = A()# print(obj)# obj1 = A()# print(obj1)# obj2 = A()# print(obj2)# 手写单例模式# class A:#     __instance = None##     def __init__(self,name):#         self.name = name##     def __new__(cls,*args,**kwargs):#         if not cls.__instance:#             cls.__instance = object.__new__(cls)#         return cls.__instance### obj = A('alex')# print(obj)# obj1 = A('李业')# print(obj1.name)# print(obj.name)

转载于:https://www.cnblogs.com/zhangshan33/p/11354771.html

你可能感兴趣的文章
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
K8s helm 创建自定义Chart
查看>>
svn和网站同步解决方案
查看>>
Redis 经验谈
查看>>
每日练习level-7
查看>>
a标签按钮样式
查看>>
JavaWeb--HttpServlet
查看>>
JavaEE——SpringMVC(2)--处理模型数据
查看>>
了解大数据
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
Eclipse更新SDK速度慢,解决办法
查看>>
将博客搬至CSDN
查看>>
具体解释MVP矩阵之ViewMatrix
查看>>
Aizu 2170 Marked Ancestor(并查集变形)
查看>>
CDH安装
查看>>
【转载】Windows Server2012安装IIS服务器
查看>>