python基础之反射内置方法元类

时间:2022-10-12 18:04:14

补充内置函数

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基础之反射内置方法元类的更多相关文章

  1. Python基础之字典内置方法

    目录 1. 字典 1.1 字典的作用 1.2 创建和使用字典 1.2.1 dict类 1.2.2 基本的字典操作 1.2.3 字典方法 1. 字典 映射:可以通过名称来访问其各个值的数据结构. 字典是 ...

  2. Python基础之列表内置方法

    目录 1. 列表 1.1 序列 1.2 通用的序列操作 1.3 列表的基本操作 1.4 列表方法 1. 列表 数据结构:以某种方式(如通过编号)组合起来的元素(如数,字符乃至其他数据结构)集合. 在p ...

  3. Python 数据类型常用的内置方法(三)

    目录 Python 数据类型常用的内置方法(三) 1.列表内置方法 1.sort():升序 2.reverse():颠倒顺序 3.列表比较运算 2.字典内置方法 1.对Key的操作 2.len( )- ...

  4. Python 数据类型常用的内置方法(二)

    目录 Python 数据类型常用的内置方法(二) 1.字符串类型常用内置方法 1.upper.lower.isupper.islower 2.startswith.endswith 3.format ...

  5. Python 数据类型常用的内置方法(一)

    目录 Python 数据类型常用的内置方法 1.整型 int 2.浮点型 float 字符串转浮点型: 3.字符串 str 多种类型转字符型: 索引 切片 len( )方法:统计字符串长度/个数 移除 ...

  6. 多态 鸭子类型 反射 内置方法(&lowbar;&lowbar;str&lowbar;&lowbar;&comma;&lowbar;&lowbar;del&lowbar;&lowbar;) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  7. Python面向对象编程及内置方法

    在程序开发中,要设计一个类,通常需要满足以下三个要求: [1]类名 这类事物的名字,满足大驼峰命名法 [2]属性 这类事物具有什么样的特征 [3]方法 这类事物具有什么样的行为 定义简单的类: 定义只 ...

  8. python基础之类的内置&lowbar;&lowbar;setattr&lowbar;&lowbar;&comma;&lowbar;&lowbar;delattr&lowbar;&lowbar;&comma;&lowbar;&lowbar;getattr&lowbar;&lowbar;和 二次加工标准类型(包装)

    一.内置attr:__setattr__,__delattr__,__getattr__ __setattr__ #添加/修改属性会触发它的执行 __delattr__ #删除属性的时候会触发 __g ...

  9. python之字典二 内置方法总结

    Python字典包含了以下内置方法: clear()函数用于删除字典内所有元素 dict1 = {, 'Class': 'First'} print('the start len %d' % len( ...

随机推荐

  1. ERP程序开发中遇到的六种错误

    经常回顾同事写的代码,发现一些问题,总结分析,用于员工培训,或系统优化方面的内容教学. 文中有问题的的代码我用黑体字标识. 1 界面与逻辑代码混淆 这是目前发现的比较严重的问题.框架花费了很大的力气, ...

  2. 开源工作流引擎CCFlow 学习专区

    http://bbs.ccflow.org/index.aspx 官网:http://www.ccflow.org/

  3. Error&colon; Cannot find a valid baseurl for repo&colon; base

    解决方法如下(修改dns配置) vi /etc/resolv.conf 在此文件最后加入:nameserver 8.8.8.8 如果没有vi编辑器可用: echo "nameserver 8 ...

  4. linux 系统下,如何清空文件内容

    最近用 crontab命令 做了一些 同步任务,可后期同步任务的代码没用了,于是,我就直接删除了 代码(对应的jar包),但是 crontab -e 的命令行没有删除 ,以后,每天我的Azure vm ...

  5. LeetCode&colon; Interval

    (1)Merge Intervals https://leetcode.com/problems/merge-intervals/ Given a collection of intervals, m ...

  6. spring--注解注入--12

    12.1  概述 12.1.1  什么是零配置 在SSH集成一章中大家注意到项目结构和包结构是不是很有规律,类库放到WEB-INF/lib文件夹下,jsp文件放到WEB-INF/jsp文件夹下,web ...

  7. lvs&lowbar;nat

    nat模式环境模拟 1.实验环境概览 192.168.1.186 192.168.75.131 双网卡 dir 调度器(vip) ipvsadm,双网卡 192.168.1.185 单网卡 rs1 真 ...

  8. mysql有多条记录的单个字段想存为一个字段显示的方法

    SELECT po.id,(SELECT GROUP_CONCAT(mr.member_type) as memberTypeList FROM prod_offer_member_rel mr WH ...

  9. POJ 3045 Cow Acrobats

    Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...

  10. java笔记----property文件读写

    package com.test.property; import java.io.BufferedInputStream; import java.io.File; import java.io.F ...