爱根,征服我的一天[isinstance,issubclass]、反射、内置attr,定制自己的数据类型

今日重点:

111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
isinstance,issubclass

# isinstance(obj,cls)检查是否obj是否是类 cls 的对象。
# issubclass(sub,super)检查sub类是否是 super 类的派生类。
class People:
    pass
class List(list):
    pass
class LIST(List):
    pass
p=People()
l=List()

print(isinstance(p,People))  #True
print(isinstance(l,People))  #False
print(issubclass(List,list))     #True
print(issubclass(People,list))   #False
print(issubclass(LIST,List))     #True
print(issubclass(LIST,list))     #True

反射:getattr,setattr,delattr,hasattr

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

#!!!!!!!!!!!!!!!!!!!!!!类也是对象!!!!!!!!!!!!!!!!!!!!!!!
class People:
    country="china"
    def test(self):
        print("from test")
p=People()
print(hasattr(p,"test"))                    #True
print(hasattr(p,"country"))                 #True
print(hasattr(People,"test"))               #True
print(hasattr(People,"country"))            #True
print(getattr(p,"test"))          #<bound method People.test of <__main__.People object at 0x000000000280D7B8>>
print(getattr(p,"123","返回值default为None,可以自己定义:這是我定义的!")) #返回值default为None,可以自己定义:這是我定义的!
a=getattr(People,"test","返回值default为None,可以自己定义:這是我定义的!")#拿到类的函数属性的内存地址。
a(p)                            #from test    调用。
setattr(p,"a123","456")         #新增对象的数据属性。
print(p.__dict__)               #{‘a123‘: ‘456‘}    对象的名称空间。
print(p.a123)                   #456     查看结果。
setattr(People,"country","China")    #修改类的变量属性。
print(People.country,People.__dict__)    #China    查看。
setattr(People,"abc","efg")          #新增类的变量属性。
print(People.__dict__)               #查看名称空间。
print(People.abc)                    #efg    检验。
delattr(p,"a123")                    #删除p名称空间下的“a123”数据属性。
print(p.__dict__)                    #验证,为{}
delattr(People,"abc")                #删除类名称空间下的“abc”数据属性。
print(People.__dict__)               #验证,没有了。
反射的简单用途!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!import sys
def add():
    print("from add")
def dell():
    print("from dell")
def change():
    print("from change")
def search():
    print("from search")
this_module=sys.modules[__name__]
while True:
    choice=input("please input you choice")
    if not choice:continue
    if hasattr(this_module,choice):
        getattr(this_module,choice)()
                                       #反射当前模块的属性
import sys    #类也是对象
country="china"
class People:
    pass
class Animal:
    acountry="Africa"
    def walk(self):
        print("From Animal")
def test():
    print("From test!")
print("-------",__name__,type(__name__))   #------- client <class ‘str‘>
this_module=sys.modules[__name__]
# print("*******",this_module)    #******* <module ‘client‘ from ‘D:\\PycharmProjects\\py_fullstack_s4\\day31\\client.py‘>
# print(hasattr(this_module,"country")) #True  判断object中有没有一个name字符串对应的方法或属性
# print(getattr(this_module,"country")) #china
# print(hasattr(this_module,"People"))  #True
# print(hasattr(this_module,"test"))    #True
# print(hasattr(this_module,"acountry"))#False
# print(hasattr(Animal,"acountry"))     #True  判断object中有没有一个name字符串对应的方法或属性
# print(hasattr(Animal,"country"))      #False
# getattr(this_module,"test")()           #From test!
# setattr(this_module,"country","CHINA")  #设置模块对象下的country数据属性。
# print(getattr(this_module,"country"))   #CHINA
# delattr(this_module,"country")            #删除属性。
# print("country" in this_module.__dict__)  #False

222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222

通过反射来实现插拔机制:

#ftpclient.py 端。
class FtpClient:
    ‘ftp客户端,但是还么有实现具体的功能‘
    def __init__(self,addr):
        print(‘正在连接服务器[%s]‘ %addr)
        self.addr=addr
    def test(self):
        print(‘test‘)
    def get(self):
        print(‘get------->‘)

#ftpserver.py 端。
import ftpclient     #导入模块!
print(ftpclient)        #ftpclient是一个模块,当然,一切皆对象,可以调用该模块下的任何属性。
print(ftpclient.FtpClient)    #<class ‘ftpclient.FtpClient‘>,这是调用该模块下的一个类。
obj=ftpclient.FtpClient(‘192.168.1.3‘)     #实例化,过程中触发该打印:正在连接服务器[192.168.1.3]
print(obj)                                 #<ftpclient.FtpClient object at 0x0000000001E7D048> 代表该模块下的类下的对象。
obj.test()              #同样,该对象可以调用他始祖模块中的函数,test。
f1=ftpclient.FtpClient(‘192.168.1.1‘)    #生成实例f1。
if hasattr(f1,‘get‘):                    #如果该实例f1下有“get”的方法,
    func=getattr(f1,‘get‘)               #则拿到该函数的内存地址,
    func()                               #执行。
# if not hasattr(f1,"abc"):
#     print("没有该方法!")               #这是不存在该方法的情况,只是举个例子。
else:
    print(‘其他逻辑‘)                     #没有的话,直接打印其他逻辑。

333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

内置attr:__getattr__,__setattr__,__delattr__

class People:
    def __init__(self,name):
        self.name=name
    def __setattr__(self, key, value):  #__setattr__添加/修改属性会触发它的执行。
        if not isinstance(value,str):
            raise("typeError")
        self.__dict__[key]=value  #如果这里是self.key=value,因为key,和value是字符串,self.后面不能是字符串,又者setattr(self,key,value)的话,就会递归。                    #setattr(self,key,value)=self.key=value,会无限的递归。
    def __delattr__(self, item):      #__delattr__删除属性的时候会触发他的执行。
        if not isinstance(item,str):
            raise("typeError")
        self.__dict__.pop(item)
    def __getattr__(self,item,):     #__getattr__只有在使用.调用属性且属性不存在的时候才会触发。
        print(item,type(item))
p=People("egon")
p.sex="male"
print(p.__dict__)
print(p.sex)
print(p.name)
print(p.xxxx)                          #xxxx <class ‘str‘>
#只有通过修改字典才能完成对对象属性的修改操作,所以只有是修改self.__dict__

444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444

定制自己的数据类型:
1.继承的方式:继承父类的方法,更改性能后来实现自己的功能。

class List(list):        #继承list类的功能。
    def append(self, object):
        if not isinstance(object,int):     #改变append数据类型的判断机制,必须是int。
            raise("must be int")
        #self.append(object)               #这样会发生递归。
        super().append(object)             #继承父类list的功能。
    @property
    def mid(self):                         #新增查看中间值的功能。
        return self[int(len(self)/2)]
a = List([1, 2, 3])
a.append(6)
print(a)
print(a.mid)
a.pop(1)                                 #其他未定义的属性还是继承父类的方法。
print(a)
a.insert(0,9)
print(a)

2.授权的方式

授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。

实现授权的关键点就是覆盖__getattr__方法

import time
class Open:
    def __init__(self,filepath,m=‘r‘,encode=‘utf-8‘):
        self.x=open(filepath,mode=m,encoding=encode)    #拿到文件句柄。
        self.filepath=filepath
        self.mode=m
        self.encoding=encode
    def write(self,line):
        print(‘f自己的write‘,line)
        t=time.strftime(‘%Y-%m-%d %X‘)
        self.x.write(‘%s %s‘ %(t,line))
    def __getattr__(self, item):
        return getattr(self.x,item)         #这项是保证除了write外其他方法可以调用。其实是从句柄中找句柄的方法,作为返回值。
f=Open(‘b.txt‘,‘w‘)
print(f)
时间: 2024-10-25 21:45:09

爱根,征服我的一天[isinstance,issubclass]、反射、内置attr,定制自己的数据类型的相关文章

Python isinstance() 函数 Python 内置函数 Python 内置函数

描述 isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系. isinstance() 会认为子类是一种父类类型,考虑继承关系. 如果要判断两个类型是否相同推荐使用 isinstance(). 语法 以下是 isinstance() 方法的语法: isinstance(object, classinfo) 参数 object -- 实例对象. class

VTP工具使用中Python函数学习--内置函数isinstance()

内置函数isinstance() isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系. isinstance() 会认为子类是一种父类类型,考虑继承关系. 如果要判断两个类型是否相同推荐使用 isinstance(). 语法 isinstance()方法的语法: isinstance(object,classinfo) 参数 object--实例对象

27 isinstance与issubclass、反射、内置方法

isinstance与issubclass issubclass:判断子类是否属于父类,是则返回True,否则返回False isinstance:判断对象是否属于类,是则返回True,否则返回False class Bar: pass class Foo(Bar): pass print(issubclass(Foo,Bar))#输出一个True obj=Foo() print(isinstance(obj,Foo))#输出一个True 反射 反射:通过字符串来反射/映射到对象/类的属性上 c

issubclass和isinstance,反射,内置方法

目录 面向对象进阶 一.issubclass 和 isinstance 1.1 issubclass 1.2 isinstance 二.反射 2.1 什么是反射 2.2 四个可以通过字符串操作对象属性和方法的内置函数 2.2.1 hasattr() 2.2.2 getattr() 2.2.3 setattr() 2.3.4 delattr() 三.内置方法 3.1 __str__和__repr__ 3.2 点拦截方法:__setattr__,__delattr__,__getattr__ 3.3

绑定与非绑定方法及反射,isinstance和issubclass内置函数

目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射 反射定义 4个可以实现反省的函数(内置函数) 反射使用场景 绑定方法与非绑定方法 1.绑定方法 ? 绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数传入 ? ? 绑定给对象的方法: ? 类中定义的函数默认就是绑定给对象的 ? 绑定给类的方法: ? 为类中定义的函数加上一个装饰器cla

爱根,你消失一天,我如坠深渊!!!模块讲解,苑之恨!!!

time模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串:(1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. (2)格式化的时间字符串(Format String): '1988-03-16'. (3)元组(struct_time) :struct_time元组共有9个元素共九个元素:

爱根,明天就能见到你了!好!亢!奋!闲来无聊,将一个正整数分解成质因数!

1 #闲来无聊,将一个正整数分解成质因数,例如900=2*3*3*3*5*5. 2 3 #1.用while循环结合for循环做. 4 # while True: 5 # num=input("input a num:") #输入数字. 6 # if num: #如果输入了: 7 # num=int(num) #转化为字符串. 8 # List=[str(num),"="] #先将这个数字加到列表开头,创造输出格式. 9 # while num>=2: #当这个

爱根,28行代码版计算器,不知有何纰漏,望大神指正!

1 # s="1 - 2 * ((60 - 30 + (-40 / 5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) - (-4 * 3) / (16 - 3 * 2))" 2 s=input("please input you number str:") 3 import re 4 s=s.replace(" ","") 5 while True: 6

爱根,python字体颜色和背景颜色!

下面是对应的颜色表: 格式:\033[显示方式;前景色;背景色m 说明: 前景色            背景色           颜色 --------------------------------------- 30                40              黑色 31                41              红色 32                42              绿色 33                43