Python 第二十六章 面向对象 元类+反射+双下方法
元类
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 第二十六章 面向对象 元类+反射+双下方法相关推荐
- 鸟哥的Linux私房菜(基础篇)- 第二十六章、Linux 核心编译与管理
第二十六章.Linux核心编译与管理 最近升级日期:2009/09/18 我们说的 Linux 其实指的就是核心 (kernel) 而已.这个核心控制你主机的所有硬件并提供系统所有的功能,所以说,他重 ...
- 第二十六章 使用 CSP 进行基于标签的开发
文章目录 第二十六章 使用 CSP 进行基于标签的开发 CSP 编译器 自动和手动页面编译 第二十六章 使用 CSP 进行基于标签的开发 CSP 允许使用标准 HTML 文件开发 CSP 应用程序. ...
- 游戏设计的艺术:一本透镜的书——第二十六章 团队以技术制作出游戏
这是一本游戏设计方面的好书 转自天之虹的博客:http://blog.sina.com.cn/jackiechueng 感谢天之虹的无私奉献 Word版可到本人的资源中下载 第二十六章团队以技术制作出 ...
- C++ Primer plus学习笔记-第十六章:string类和标准模板库
第十六章:string类和标准模板库 前言:这一章已经相当靠近全书的后面部分了:这一章我们会深入探讨一些技术上的细节,比如string的具体构造函数,比如适用于string类的几个函数,比如我们还会介 ...
- Windows核心编程(笔记13) 第十六章--第二十六章
改变下记录方式,只写自己觉得需要注意一下的防止出错的地方,或者一些特别重要的点,或者一些感悟. 第十六章 线程栈 第十七章 内存映射文件 1.注意写时复制在内存映射文件中的用处. 2.#pagma d ...
- C++程序设计原理与实践 习题答案 第二十六章 第26章习题答案
第二十六章:测试 习题答案 本章的BinarySearch Binary_Search.h 26.2 26.2 测试集 26.3 26.4 26.5 26.8 and 26.9 26.8 测试集 26 ...
- 第二十六章 数论——欧拉函数(详解与证明)
第二十六章 数论--欧拉函数(详解与证明) 欧拉函数 1.互质 2.欧拉函数的定义 3.欧拉函数的公式 4.欧拉函数的证明 5.欧拉函数的使用 (1)问题一: 思路 代码 (2)问题二: 思路 cas ...
- 现实迷途 第二十六章 陷入情网
第二十六章 陷入情网 注:原创作品,请尊重原作者,未经同意,请勿转载,否则追究责任. 在西餐厅不停播放着的轻柔抒情的英文歌曲中,江北和钱珊边聊边共进晚餐,美酒,美食,美妙的音乐,加上很有格调的就餐环境 ...
- 【软考软件评测师】第二十六章 计算机安全设计(其他知识)
[软考软件评测师]第二十六章 计算机安全设计(其他知识) 第二十六章 计算机安全设计(其他知识) [软考软件评测师]第二十六章 计算机安全设计(其他知识) 第一部分 知识点集锦 1.5G技术 2.云计 ...
最新文章
- SAP RETAIL 根据Allocation Rule去创建分配表
- jQuery中的动画
- python绘制球体_趣学Python之弹球游戏第一阶段--画个红球
- 木七七施辰刚:我是这样将玩家次留提升了 5% 的
- pythonturtle怎么写_让Python的turtle命令更简短(译)
- Maven web项目创建
- linux在所有文件中查找某一个字符
- 简化路径Python解法
- 图深度学习-第1部分
- BlockingQueue使用详解以及测试代码
- 拓端tecdat|SAS可视化高级ODS图形:PROC SGPLOT,BY组和SG注释
- 【技术】Java打印菱形
- 在使用firefly的RK3308的SDK使用buildroot构造文件系统时,遇到OEM分区和userdata不能挂在成功的问题
- 重磅!腾讯优图29篇论文入选顶会ECCV 2022
- 【Python学习笔记②】——基础的数据结构【两万字总结 + 字符串、列表、元组、字典 + 增删查改】
- smartforms
- Java中的四个核心技术思想
- loadrunner录制网页脚本时打不开或打开慢
- 在iOS应用中使用字体图标及制作字体库
- Maven中java/javaweb工程目录结构,<buid>、<properties>标签