元类

class A:pass
obj = 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:@classmethoddef func(cls,a):pass@staticmethoddef 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 = 1print('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

Python 第二十六章 面向对象 元类+反射+双下方法相关推荐

  1. 鸟哥的Linux私房菜(基础篇)- 第二十六章、Linux 核心编译与管理

    第二十六章.Linux核心编译与管理 最近升级日期:2009/09/18 我们说的 Linux 其实指的就是核心 (kernel) 而已.这个核心控制你主机的所有硬件并提供系统所有的功能,所以说,他重 ...

  2. 第二十六章 使用 CSP 进行基于标签的开发

    文章目录 第二十六章 使用 CSP 进行基于标签的开发 CSP 编译器 自动和手动页面编译 第二十六章 使用 CSP 进行基于标签的开发 CSP 允许使用标准 HTML 文件开发 CSP 应用程序. ...

  3. 游戏设计的艺术:一本透镜的书——第二十六章 团队以技术制作出游戏

    这是一本游戏设计方面的好书 转自天之虹的博客:http://blog.sina.com.cn/jackiechueng 感谢天之虹的无私奉献 Word版可到本人的资源中下载 第二十六章团队以技术制作出 ...

  4. C++ Primer plus学习笔记-第十六章:string类和标准模板库

    第十六章:string类和标准模板库 前言:这一章已经相当靠近全书的后面部分了:这一章我们会深入探讨一些技术上的细节,比如string的具体构造函数,比如适用于string类的几个函数,比如我们还会介 ...

  5. Windows核心编程(笔记13) 第十六章--第二十六章

    改变下记录方式,只写自己觉得需要注意一下的防止出错的地方,或者一些特别重要的点,或者一些感悟. 第十六章 线程栈 第十七章 内存映射文件 1.注意写时复制在内存映射文件中的用处. 2.#pagma d ...

  6. C++程序设计原理与实践 习题答案 第二十六章 第26章习题答案

    第二十六章:测试 习题答案 本章的BinarySearch Binary_Search.h 26.2 26.2 测试集 26.3 26.4 26.5 26.8 and 26.9 26.8 测试集 26 ...

  7. 第二十六章 数论——欧拉函数(详解与证明)

    第二十六章 数论--欧拉函数(详解与证明) 欧拉函数 1.互质 2.欧拉函数的定义 3.欧拉函数的公式 4.欧拉函数的证明 5.欧拉函数的使用 (1)问题一: 思路 代码 (2)问题二: 思路 cas ...

  8. 现实迷途 第二十六章 陷入情网

    第二十六章 陷入情网 注:原创作品,请尊重原作者,未经同意,请勿转载,否则追究责任. 在西餐厅不停播放着的轻柔抒情的英文歌曲中,江北和钱珊边聊边共进晚餐,美酒,美食,美妙的音乐,加上很有格调的就餐环境 ...

  9. 【软考软件评测师】第二十六章 计算机安全设计(其他知识)

    [软考软件评测师]第二十六章 计算机安全设计(其他知识) 第二十六章 计算机安全设计(其他知识) [软考软件评测师]第二十六章 计算机安全设计(其他知识) 第一部分 知识点集锦 1.5G技术 2.云计 ...

最新文章

  1. SAP RETAIL 根据Allocation Rule去创建分配表
  2. jQuery中的动画
  3. python绘制球体_趣学Python之弹球游戏第一阶段--画个红球
  4. 木七七施辰刚:我是这样将玩家次留提升了 5% 的
  5. pythonturtle怎么写_让Python的turtle命令更简短(译)
  6. Maven web项目创建
  7. linux在所有文件中查找某一个字符
  8. 简化路径Python解法
  9. 图深度学习-第1部分
  10. BlockingQueue使用详解以及测试代码
  11. 拓端tecdat|SAS可视化高级ODS图形:PROC SGPLOT,BY组和SG注释
  12. 【技术】Java打印菱形
  13. 在使用firefly的RK3308的SDK使用buildroot构造文件系统时,遇到OEM分区和userdata不能挂在成功的问题
  14. 重磅!腾讯优图29篇论文入选顶会ECCV 2022
  15. 【Python学习笔记②】——基础的数据结构【两万字总结 + 字符串、列表、元组、字典 + 增删查改】
  16. smartforms
  17. Java中的四个核心技术思想
  18. loadrunner录制网页脚本时打不开或打开慢
  19. 在iOS应用中使用字体图标及制作字体库
  20. Maven中java/javaweb工程目录结构,<buid>、<properties>标签

热门文章

  1. 《Python数据可视化之Matplotlib与Pyecharts》之K线图
  2. 一位美国教授给研究生的怎样记读书笔记的建议(中文总结)
  3. 物体识别桌 开发系列之一
  4. PR/PO一锅粥,关键信息一图兜
  5. iView级联选择器Cascader回显慢的问题
  6. 参考文献中英文人名_参考文献英文名字应该怎么写?
  7. 微信聊天,对方回复“哦”怎么办?学会这3个技巧,永不尬聊
  8. MATLAB当中一些简单的数值分析函数总结
  9. 11.NDP协议分析与实践
  10. Python 基于BP神经网络的鸢尾花分类