python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法

一、内置函数补充

1、isinstance(obj,cls)检查是否obj是否是类 cls 的对象

class Foo(object):
  pass
obj = Foo()
print(isinstance(obj, Foo))  #结果为True

2、issubclass(sub, super)检查sub类是否是 super 类的派生类

class Foo(object):
  pass
class Bar(Foo):
  pass
print(issubclass(Bar, Foo))  #结果为True

二、 反射

1 、什么是反射

  反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

2 、python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数:

hasattr、getattr、setattr、delattr

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

# 1、hasattr
# print(hasattr(People,‘country‘))  #True
# print(‘country‘ in People.__dict__)    #不知道hasattr方法时,用的方法
# print(hasattr(obj,‘name‘))          #True
# print(hasattr(obj,‘country‘))       #True
# print(hasattr(obj,‘tell‘))          #True

# 2、getattr
# x=getattr(People,‘country1‘,None)      #查找指定属性,没有此属性(提前预防报错写None)显示None,有就返回值
# print(x)
# f=getattr(obj,‘tell‘,None)#obj.tell
# print(f == obj.tell)                 #True
# f()                               #正常的调用函数
# obj.tell()

# 3、setattr
# People.x=111
# setattr(People,‘x‘,111)              #添加x属性,值为111
# print(People.x)
# obj.age=18
# setattr(obj,"age",18)             # 添加age属性,值为18
# print(obj.__dict__)

# 4、delattr
# del People.country               #原始的方法
# delattr(People,"country")
# print(People.__dict__)
# del obj.name
# delattr(obj,"name")
# print(obj.__dict__)

三、__str__

class People:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def __str__(self):
        # print(‘========>‘)
        return ‘<名字:%s 年龄:%s 性别:%s>‘ %(self.name,self.age,self.sex)

obj=People(‘duoduo‘,18,‘male‘)
print(obj) #print(obj.__str__())  在print时触发__str__

四、 __del__

当对象在内存中被释放时,自动触发执行。

注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源

import time

class People:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def __del__(self): # 在对象被删除的条件下,自动执行
        print(‘__del__‘)

obj=People(‘duoduo‘,18,‘male‘)

#del obj #obj.__del__()      #先删除的情况下,直接执行__del__

time.sleep(5)    #可以更形象的看出在资源回收前执行__del__

典型的应用场景:

创建数据库类,用该类实例化出数据库链接对象,对象本身是存放于用户空间内存中,而链接则是由操作系统管理的,存放于内核空间内存中

当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有被回收,这就需要我们定制__del__,在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源

这与文件处理是一个道理:

f=open(‘a.txt‘) #做了两件事,在用户空间拿到一个f变量,在操作系统内核空间打开一个文件
del f #只回收用户空间的f,操作系统的文件还处于打开状态
#所以我们应该在del f之前保证f.close()执行,即便是没有del,程序执行完毕也会自动del清理资源,于是文件操作的正确用法应该是
f=open(‘a.txt‘)
读写...
f.close()
#很多情况下大家都容易忽略f.close,这就用到了with上下文管理

class MyOpen:          #自己写个打开读文件类,封装内置的open
    def __init__(self,filepath,mode="r",encoding="utf-8"):
        self.filepath=filepath
        self.mode=mode
        self.encoding=encoding
        self.fobj=open(filepath,mode=mode,encoding=encoding)  #申请系统内存

    def __str__(self):
        msg="""
        filepath:%s
        mode:%s
        encoding:%s
        """ %(self.filepath,self.mode,self.encoding)
        return msg

    def __del__(self):
        self.fobj.close()

f=MyOpen(‘aaa.py‘,mode=‘r‘,encoding=‘utf-8‘)
# print(f.filepath,f.mode,f.encoding)
# print(f)

# print(f.fobj)
res=f.fobj.read()   #一样可以读
print(res)

五、exec

#例子 一
code="""
#global x     #shsh声明x为全局变量
x=0
y=2
"""
global_dic={‘x‘:100000}
local_dic={}         #字符串中声明全局就是全局,不声明就是局部
exec(code,global_dic,local_dic)
#
# print(global_dic)
# print(local_dic)

#例子 二
# code="""
# x=1
# y=2
# def f1(self,a,b):
#     pass
# """
# local_dic={}
# exec(code,{},local_dic)
# print(local_dic)

六、元类

1、什么是元类:

  类的类就是元类
#我们用class定义的类使用来产生我们自己的对象的
#内置元类type是用来专门产生class定义的类的

#一切皆为对象:
# Chinese=type(...)
 class Chinese:
     country="China"

     def __init__(self,name,age,sex):
         self.name=name
         self.age=age
         self.sex=sex

     def speak(self):
         print(‘%s speak Chinese‘ %self.name)

# print(Chinese)
# p=Chinese(‘duoduo‘,18,‘male‘)
# print(type(p))     #最上层的类 type

# print(type(Chinese))

2、用内置的元类type,来实例化得到我们的类

#2、用内置的元类type,来实例化得到我们的类
class_name=‘Chinese‘
class_bases=(object,)
lass_body="""
country="China"
def __init__(self,name,age,sex):
     self.name=name
     self.age=age
     self.sex=sex
 def speak(self):
     print(‘%s speak Chinese‘ %self.name)
 """
class_dic={}
exec(class_body,{},class_dic)
 #类的三大要素
# print(class_name,class_bases,class_dic)

Chinese=type(class_name,class_bases,class_dic)
# print(Chinese)

p=Chinese(‘duoduo‘,18,‘male‘)
# print(p.name,p.age,p.sex)

3、 __call__ 

对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
    def __init__(self):
        pass
    def __str__(self):
        return ‘123123‘
    def __del__(self):
        pass
    # 调用对象,则会自动触发对象下的绑定方法__call__的执行,
    # 然后将对象本身当作第一个参数传给self,将调用对象时括号内的值
    #传给*args与**kwargs
    def __call__(self, *args, **kwargs):
        print(‘__call__‘,args,kwargs)

obj=Foo()
# print(obj)

obj(1,2,3,a=1,b=2,c=3) #

4、自定义元类

class Mymeta(type):
    # 来控制类Foo的创建
    def __init__(self,class_name,class_bases,class_dic): #self=Foo
        # print(class_name)
        # print(class_bases)
        # print(class_dic)
        if not class_name.istitle():     #加上判断
            raise TypeError(‘类名的首字母必须大写‘)

        if not class_dic.get(‘__doc__‘):
            raise TypeError(‘类中必须写好文档注释‘)

    super(Mymeta,self).__init__(class_name,class_bases,class_dic)

    # 控制类Foo的调用过程,即控制实例化Foo的过程
    def __call__(self, *args, **kwargs): #self=Foo,args=(1111,) kwargs={}
        # print(self)
        # print(args)
        # print(kwargs)

        #1 造一个空对象obj
        obj=object.__new__(self)

        #2、调用Foo.__init__,将obj连同调用Foo括号内的参数一同传给__init__
        self.__init__(obj,*args,**kwargs)

        return obj

#Foo=Mymeta(‘Foo‘,(object,),class_dic)
class Foo(object,metaclass=Mymeta):
    """
    文档注释
    """
    x=1
    def __init__(self,y):
        self.Y=y

    def f1(self):
        print(‘from f1‘)

obj=Foo(1111) #Foo.__call__()

# print(obj)
# print(obj.y)
# print(obj.f1)
# print(obj.x)

5、单例模式

import settings   #调用配置文件的IP,PORT

class MySQL:
    __instance=None
    def __init__(self,ip,port):
        self.ip=ip
        self.port=port

    @classmethod   #绑定方法
    def singleton(cls):
        if not cls.__instance:
            obj=cls(settings.IP, settings.PORT)
            cls.__instance=obj
        return cls.__instance

obj1=MySQL(‘1.1.1.2‘,3306)
obj2=MySQL(‘1.1.1.3‘,3307)
obj3=MySQL(‘1.1.1.4‘,3308)

# obj4=MySQL(settings.IP,settings.PORT)
# print(obj4.ip,obj4.port)

obj4=MySQL.singleton()
obj5=MySQL.singleton()
obj6=MySQL.singleton()

print(obj4 is obj5 is obj6)    #Ture

原文地址:https://www.cnblogs.com/ManyQian/p/8868350.html

时间: 2024-10-13 23:26:58

python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法的相关文章

python_day4内置函数补充

之前内容回顾 1.python基础 2.基本数据类型:str.dict.list.tuple.set.. s = "alex" => str # s是创建的一个对象,所有功能被保存在其对应的str的类里 对象是类的实例 isinstance(s, str) ==> True 3.函数式编程 函数定义 内置函数 文件处理 注意: li = [11,22,33,44] def f1(arg):     #此函数没有返回值,默认返回None arg.append(55) li =

Day4 内置函数补充、装饰器

li = [11,22,33,44]def f1(arg): arg.append(55)#函数默认返回值None,函数参数传递的是引用li = f1(li) print(li) 内置函数补充: 判断是否被调用 def f1(): pass print(callable(f1)) ASCII码与数字转换 #数字转换为ASCII码r = chr(65)print(r)#ASCII转换为数字n = ord('a')print(n) 随机验证码 import randomlist_temp =[]fo

Python基础----内置函数补充、匿名函数、递归函数

内置函数补充 python divmod()函数:把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b) 语法: 1 divmod(a, b) #a.b为数字,a为除数,b为被除数 示例: 1 >>> divmod(7, 2) 2 (3, 1) #3为商,1为余数 3 >>> divmod(7, 2.5) 4 (2.0, 2.0) 应用:web前端页数计算 1 total_count=73 2 per_count=23 3 res=div

内置函数补充,__str__方法、__del__方法 和 __call__方法和元祖

一 .内置函数补充 1.isinstance函数: isinstance(obj,cls)检查obj是否是类 cls 的对象 使用该函数来判断一个函数的类型 2. issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo) 3.下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 clas

Python菜鸟之路一:Python基础-内置函数补充

常用内置函数及用法: 1. callable() def callable(i_e_, some_kind_of_function): # real signature unknown; restored from __doc__ """检查对象object是否可调用.如果返回True,object仍然可能调用失败:但如果返回False,调用对象ojbect绝对不会成功 Return whether the object is callable (i.e., some kin

Python 内置函数补充匿名函数

Python3 匿名函数 定义一个函数与变量的定义非常相似,对于有名函数,必须通过变量名访问 def func(x,y,z=1): return x+y+z print(func(1,2,3)) 匿名函数定义:使用 lambda 来创建匿名函数 匿名函数1. 没有名字 2:函数体自带return 匿名函数 def func(x,y,z=1): return x+y+z print(lambda x,y,z=1:x+y+z) function <lambda> at 0x000000000346

learn_Day14 内置函数补充、反射、初识面向对象

内置函数 __import__()用于导入模块 getattr 用于寻找模块的指定对象 a = __import__('b')  # b为模块名,b是字符串 ==>> 导入模块b并重新命名为a c = getattr(a,'d')  # d为模块中指定对象 ==>> 找到模块中命名为d的对象 d() ==>> 执行d # getattr(a,'b', c) # 从a模块中导入b.c参数可不写表示找不到报错:c为None表示找不到不报错,返回None. # hasattr

常用内置函数补充

常用内置函数: 1.calladle()是验证一个对象可不可以被调用. 2.chr() 是通过数字在ask码里找到指定字符. 3.ord()通过字符找到它在ask码里对应的数字 4.import random 随机生成数字的模块,想要随机生成数字时调用(应用场景随机验证码) 5.random.randrange(65,91)也就是我们生成的数字大于65小于91. 6.compile()将字符串编译成python代码 k=compile(i,"<string>","

python 内置函数补充

内置函数 callable(object) callable()函数用于测试对象是否可调用,如果可以则返回True(真):否则返回False(假) 1 def a1(): 2 pass 3 a1() 4 5 6 a2 = 123 7 print(callable(a1)) 8 print(callable(a2)) 9 10 #输出结果 11 True #a1可调用 12 False #a2不可调用 chr(i) chr()函数返回ASCII码对应的字符串 1 a1 = chr(65) 2 pr