python基础之反射内置方法元类
补充内置函数
isinstance(obj,Foo) # 判断obj是不是foo的实例
issubclass() # 判断一个类是不是另一个类的子类
反射
什么是反射?
通过字符串来操作类或者对象的属性
怎么用?
hasattr(adj,’xxx’) 判断adj有没有’xxx’属性
getattr(adj,’xxx’,None) adj有’xxx’就返回adj.xxx,没有则返回None,若不指定第三个 参数,没有则会报错
setattr(adj,’age’,18) adj.age = 18
delattr(adj,’age’) def adj.age
内置方法
def __str__(self):在对象被打印时,自动触发,应该在该方法内采集与对象有关的信息并return,当print(adj)是会打印__str__(self)中的return值
def __del__(self) 析构方法,对象被删之前自动触发
元类
什么是元类?
python中一切皆对象,用class定义的类本身也是一个对象,负责产生该类对象的类称为元类
为何用元类?
元类可以负责产生类,进而控制类的产生还可以控制对象的产生
如何用元类?
①储备知识:
exec()
参数一:字符串形式的命令
参数二:全局作用域(字典形式),如果不指定,默认为globals()
参数三:局部作用域(字典形式),如果不指定,默认为locals()
可以把exec命令的执行当成是一个函数的执行,会将执行期间产生的名字存放于局部名称空间中
创建类的三个要素:类名,父类,类的名称空间
#类名
class_name='Chinese'
#类的父类
class_bases=(object,)
#类的名称空间
class_dic = {}
#类体
class_body="""
country='China'
def __init__(self,name,age):
self.name=name
self.age=age
def talk(self):
print('%s is talking' %self.name)
"""
exec(class_body,{},class_dic)
People = type(class_name,class_bases,class_dic) # 实例化类
class运行原理:
1.拿到一个字符串形式的类名
2.拿到类的基类们
3.执行类体代码,拿到类的名称空间
4.调用type()再赋值给变量名
应用:自定义元类控制类的产生过程,其实就是调用元类的过程
#如果说People=type(类名,类的父类们,类的名称空间),那么我们定义元类如下,来控制类的创建
class Mymeta(type): # 继承默认元类的一堆属性
def __init__(self, class_name, class_bases, class_dic):
if '__doc__' not in class_dic or not class_dic.get('__doc__').strip():
raise TypeError('必须为类指定文档注释') if not class_name.istitle():
raise TypeError('类名首字母必须大写') super(Mymeta, self).__init__(class_name, class_bases, class_dic) class People(object, metaclass=Mymeta):
country = 'China' def __init__(self, name, age):
self.name = name
self.age = age def talk(self):
print('%s is talking' % self.name) #自定义元类,控制类的调用(即实例化)的过程
class Mymeta(type): #继承默认元类的一堆属性
def __init__(self,class_name,class_bases,class_dic):
if not class_name.istitle():
raise TypeError('类名首字母必须大写') super(Mymeta,self).__init__(class_name,class_bases,class_dic) def __call__(self, *args, **kwargs):
#self=People
print(self,args,kwargs) #<class '__main__.People'> ('egon', 18) {} #1、实例化People,产生空对象obj
obj=object.__new__(self) #2、调用People下的函数__init__,初始化obj
self.__init__(obj,*args,**kwargs) #3、返回初始化好了的obj
return obj class People(object,metaclass=Mymeta):
country='China' def __init__(self,name,age):
self.name=name
self.age=age def talk(self):
print('%s is talking' %self.name) obj=People('egon',18)
print(obj.__dict__) #{'name': 'egon', 'age': 18}
python基础之反射内置方法元类的更多相关文章
- Python基础之字典内置方法
		目录 1. 字典 1.1 字典的作用 1.2 创建和使用字典 1.2.1 dict类 1.2.2 基本的字典操作 1.2.3 字典方法 1. 字典 映射:可以通过名称来访问其各个值的数据结构. 字典是 ... 
- Python基础之列表内置方法
		目录 1. 列表 1.1 序列 1.2 通用的序列操作 1.3 列表的基本操作 1.4 列表方法 1. 列表 数据结构:以某种方式(如通过编号)组合起来的元素(如数,字符乃至其他数据结构)集合. 在p ... 
- Python 数据类型常用的内置方法(三)
		目录 Python 数据类型常用的内置方法(三) 1.列表内置方法 1.sort():升序 2.reverse():颠倒顺序 3.列表比较运算 2.字典内置方法 1.对Key的操作 2.len( )- ... 
- Python 数据类型常用的内置方法(二)
		目录 Python 数据类型常用的内置方法(二) 1.字符串类型常用内置方法 1.upper.lower.isupper.islower 2.startswith.endswith 3.format ... 
- Python 数据类型常用的内置方法(一)
		目录 Python 数据类型常用的内置方法 1.整型 int 2.浮点型 float 字符串转浮点型: 3.字符串 str 多种类型转字符型: 索引 切片 len( )方法:统计字符串长度/个数 移除 ... 
- 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理
		''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ... 
- Python面向对象编程及内置方法
		在程序开发中,要设计一个类,通常需要满足以下三个要求: [1]类名 这类事物的名字,满足大驼峰命名法 [2]属性 这类事物具有什么样的特征 [3]方法 这类事物具有什么样的行为 定义简单的类: 定义只 ... 
- python基础之类的内置__setattr__,__delattr__,__getattr__和 二次加工标准类型(包装)
		一.内置attr:__setattr__,__delattr__,__getattr__ __setattr__ #添加/修改属性会触发它的执行 __delattr__ #删除属性的时候会触发 __g ... 
- python之字典二 内置方法总结
		Python字典包含了以下内置方法: clear()函数用于删除字典内所有元素 dict1 = {, 'Class': 'First'} print('the start len %d' % len( ... 
随机推荐
- 类图(Class Diagram)
			类图(Class Diagram): 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 类一般由三部分组成: 类名(Class):每个类都必须 ... 
- 如何更新远程主机上的 Linux 内核
			如何更新远程主机上的 Linux 内核 http://blog.csdn.net/robertsong2004/article/details/47277121 转载至:http://www.tiny ... 
- mac10.9下安装Android
			这里记录一下mac下安装android比较快捷的方法 首先,到这里下载Android SDK,这个是集成的,所有工具一应俱全,免去了下载一堆东西的烦恼.具体包括如下: Eclipse + ADT pl ... 
- tornado当用户输入的URL无效时转入设定的页面
			今天做web的测验..坑爹的要用tornado...作为一个比较新的用的人还不多的东东...查资料好麻烦.. 下面是当用户输入非法 url时, 显示一个自定义 404 页面提示用户,其访问的页面不存在 ... 
- Win10下Anaconda3安装CPU版本TensorFlow并使用Pycharm开发
			环境:windows10 软件:Anaconda3 1.安装Anaconda 选择相应的Anaconda进行安装,下载地址点击这里,下载对应系统版本的Anaconda3. 运行 开始菜单->An ... 
- php设计模式五----适配器模式
			1.简介 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口 ... 
- beego学习笔记(1)
			公司准备开发一个针对塔吊行业的APP. 后台采用微服务,docker容器部署. 准备采用go进行微服务的开发. 采用beego进行restful API的开发. 第一步,访问beego的官方网站: h ... 
- react todolist
			import React, {Component} from 'react'; class AddItem extends React.Component { constructor(props) { ... 
- 在k8s中安装flannel的故障解决: Failed to create SubnetManager: error retrieving pod spec for  : the server does not allow access to the requested resource
			花了一个上午来追踪问题,k8s都反复新建了十多次,docker都重启了几次.(一次显示不有获取磁盘空间,重启docker,清空存储解决) 在用kubeadm安装容器化的几个组件时,flannel组件死 ... 
- Python基础系列----环境的搭建及简单输入、输出
			1.Python 以下信 ... 
