面向对象-反射-其他内置方法

1.反射

1.1反射含义

通过字符串的形式操作对象的相关属性。
方法有hasattr,getattr,delattr

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class People:
    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.name) #obj.__dict__[‘name‘]
print(obj.talk)
choice=‘name‘
# 这样直接使用字符串是不可以的,报错信息 AttributeError: ‘People‘ object has no attribute ‘choice‘
# print(obj.choice) #print(obj.‘name‘)

#但是反射,可以通过字符串操作对象中的属性
print("hasattr(obj,‘name‘)===",hasattr(obj,‘name‘)) #等同obj.name #obj.__dict__[‘name‘]
print("hasattr(obj,‘talk‘)===",hasattr(obj,‘talk‘)) #等同#obj.talk
print("hasattr(obj,‘talk12‘)===",hasattr(obj,‘talk12‘))

print("getattr(obj,‘namexxx‘,None)===",getattr(obj,‘namexxx‘,None))
print("getattr(obj,‘talk‘,None)===",getattr(obj,‘talk‘,None))

setattr(obj,‘sex‘,‘male‘) #obj.sex=‘male‘
print("setattr(obj,‘sex‘,‘male‘)===",obj.sex)

delattr(obj,‘age‘) #del obj.age
print("delattr(obj,‘age‘)===",obj.__dict__)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
egon
<bound method People.talk of <__main__.People object at 0x000001B3F1348940>>
hasattr(obj,‘name‘)=== True
hasattr(obj,‘talk‘)=== True
hasattr(obj,‘talk12‘)=== False
getattr(obj,‘namexxx‘,None)=== None
getattr(obj,‘talk‘,None)=== <bound method People.talk of <__main__.People object at 0x000001B3F1348940>>
setattr(obj,‘sex‘,‘male‘)=== male
delattr(obj,‘age‘)=== {‘name‘: ‘egon‘, ‘sex‘: ‘male‘}

Process finished with exit code 0

1.2反射的应用

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
#反射的应用:

class Service:
    def run(self):
        while True:
            inp=input(‘>>: ‘).strip() #cmd=‘get a.txt‘
            cmds=inp.split() #cmds=[‘get‘,‘a.txt‘]

            # print(cmds)
            if hasattr(self,cmds[0]):
                func=getattr(self,cmds[0])
                func(cmds)

    def get(self,cmds):
        print(‘get.......‘,cmds)
    def put(self,cmds):
        print(‘put.......‘,cmds)

obj=Service()
obj.run()

print("getattr(obj,‘namexxx‘,None)===",getattr(obj,‘namexxx‘,None))
print("getattr(obj,‘talk‘,None)===",getattr(obj,‘talk‘,None))

setattr(obj,‘sex‘,‘male‘) #obj.sex=‘male‘
print("setattr(obj,‘sex‘,‘male‘)===",obj.sex)

delattr(obj,‘age‘) #del obj.age
print("delattr(obj,‘age‘)===",obj.__dict__)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
>>: get a.txt
get....... [‘get‘, ‘a.txt‘]

2.其他内置方法

2.1item系列

__getitem__   obj[‘name‘]像字典一样调用属性的时候会触发__getitem__执行
__setitem__   obj[‘age‘]=22像字典一样设置属性的时候会触发__setitem__执行
__delitem__   del obj[‘age‘]像字典一样删除属性的时候会触发__delitem__执行
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Foo: #Dict
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item):
        print(‘getitem...self.__dict__.get(%s)‘%item)
        # 这里不返回,obj[‘name‘]是不会获取到值的,因为这样操作就是执行__getitem__方法
        return self.__dict__.get(item)

    def __setitem__(self, key, value):
        print("setitem...self.__dict__[%s]=%s"%(key,value))
        self.__dict__[key]=value

    def __delitem__(self, key):
        print("delitem...del self.__dict__[%s]"%key)
        del self.__dict__[key]

obj=Foo(‘egon‘)
# 查看属性
print(obj.__dict__)
# getitem触发时机:obj[‘name‘]像字典一样调用属性的时候,会触发
print("obj[‘name‘]",obj[‘name‘]) #结果egon
print("obj[‘namexx‘]",obj[‘namexx‘]) # 没有,返回None
print("obj.name",obj.name) # 这样不会触发__getitem__,必须让字典一样操作才会触发

#设置属性
obj.sex=‘male‘  #这样不会触发__setitem__,但也能给对象添加数据属性
print("obj.sex=‘male‘====",obj.__dict__)
print("obj.sex======",obj.sex)
obj["age"]=22
print("obj[‘age‘]=22======",obj.__dict__)
print("obj.age======",obj.age) #设置后,可以直接使用对象来获取数据属性

#删除属性

del obj.sex #这样不会触发__del__item
print("del obj.sex====",obj.__dict__)
del obj[‘age‘]
print("del obj[‘age‘]====",obj.__dict__)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
{‘name‘: ‘egon‘}
getitem...self.__dict__.get(name)
obj[‘name‘] egon
getitem...self.__dict__.get(namexx)
obj[‘namexx‘] None
obj.name egon
obj.sex=‘male‘==== {‘name‘: ‘egon‘, ‘sex‘: ‘male‘}
obj.sex====== male
setitem...self.__dict__[age]=22
obj[‘age‘]=22====== {‘name‘: ‘egon‘, ‘sex‘: ‘male‘, ‘age‘: 22}
obj.age====== 22
del obj.sex==== {‘name‘: ‘egon‘, ‘age‘: 22}
delitem...del self.__dict__[age]
del obj[‘age‘]==== {‘name‘: ‘egon‘}

Process finished with exit code 0

2.2isinstance和issubclass

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

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Foo(object):
    pass
obj = Foo()
print(isinstance(obj, Foo))

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
True

Process finished with exit code 0
"issubclass(sub, super)检查sub类是否是 super 类的派生类"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Foo(object):
    pass
class Bar(Foo):
    pass

print(issubclass(Bar, Foo))

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
True

Process finished with exit code 0

2.3reprstr

"没有设置这两个方法时"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class School:
    def __init__(self,name,addr,type):
        self.name=name
        self.addr=addr
        self.type=type

s1=School(‘oldboy1‘,‘北京‘,‘私立‘)
print(‘from repr: ‘,repr(s1))
print(‘from str: ‘,str(s1))
print(s1)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
from repr:  <__main__.School object at 0x000001CC930BEAC8>
from str:  <__main__.School object at 0x000001CC930BEAC8>
<__main__.School object at 0x000001CC930BEAC8>

Process finished with exit code 0
"可以显式调用repr和str方法,
repr和str方法同时存在时,会优先调用str方法,
str方法没有时,会调用repr方法
repr和str方法都是在print(obj)时调用的,没有这两个方法,输出的是对象的内存地址,有了这两个方法,就可以自行设置有意义的输出"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class School:
    def __init__(self,name,addr,type):
        self.name=name
        self.addr=addr
        self.type=type

    def __repr__(self):
        return ‘School(%s,%s)‘ %(self.name,self.addr)
    def __str__(self):
        return ‘(%s,%s)‘ %(self.name,self.addr)

s1=School(‘oldboy1‘,‘北京‘,‘私立‘)
# 可以显式调用repr和str方法
print(‘from repr: ‘,repr(s1))
print(‘from str: ‘,str(s1))
print(‘from repr: ‘,s1.__repr__())
print(‘from str: ‘,s1.__str__())

print(s1)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
from repr:  School(oldboy1,北京)
from str:  (oldboy1,北京)
from repr:  School(oldboy1,北京)
from str:  (oldboy1,北京)
(oldboy1,北京)

Process finished with exit code 0

2.4del

"程序正常结束后,或回收系统资源时如f.close(),会调用__del__"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Open:
    def __init__(self,filename):
        print(‘open file.......‘)
        self.filename=filename

    def __del__(self):
        print(‘回收操作系统资源:self.close()‘)
f=Open(‘settings.py‘)

print(‘----main------‘)
"手动del,会提前执行__del__"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Open:
    def __init__(self,filename):
        print(‘open file.......‘)
        self.filename=filename

    def __del__(self):
        print(‘回收操作系统资源:self.close()‘)
f=Open(‘settings.py‘)
#程序结束的时候,会自动del f 回收f,就会执行__del__
del f  # 如果没有这行代码,会先执行print(--main--),之后回收f,运行__del__,如果手动在这里del,就会先执行__del__,然后执行后面语句
print(‘----main------‘)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
open file.......
回收操作系统资源:self.close()
----main------

Process finished with exit code 0

原文地址:https://blog.51cto.com/10983441/2393880

时间: 2024-11-08 20:42:58

面向对象-反射-其他内置方法的相关文章

python全栈开发【第十七篇】面向对象反射和内置方法

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定

Python学习【第14篇】:面向对象之反射以及内置方法

面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被

面向对象的进阶---反射--一些内置方法

反射 反射和一些类的内置方法 1 isinstance ---- issubclass type()--判断 是不是 ininstance(object,cls) 判断 是不是类的对象 如果这个类有父类 这个对象也是这个父类的对象 issubclaaa(cls,cls) 判断一个类是不是另一个类的子类 ============================= 反射 ================================= 把一个字符串 类型的变量 变成一个 真实存在这个程序中的变量名

面向对象之反射及内置方法

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定

面向对象:反射、内置方法

反射:通过字符串映射到对象或者类的属性 反射的方法: class People: country = "China" def __init__(self,name,age): self.name = name self.age = age def talk(self): print("%s is talking" % self.name) obj = People("neo",22) """ 判断是否拥有某个属性:

面向对象进阶:反射以及内置方法

一.反射 反射:使用字符串数据类型的变量名来获取这个变量的值 input:用户输入的如果是a,那么打印1.如果输入的是b那么就打印2.如果输入name,那么打印alex 文件:从文件中读出的字符串,想转换成变量的名字 网络:将网络传输的字符串转换成变量的名字 1.反射类中的变量:静态属性,类方法 # class Foo: # School = 'oldboy' # Country = 'China' # language = 'Chinese' # @classmethod # def clas

day27 反射、内置方法

一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) # print(isinstance(s,Son)) # print(isinstance(s,Foo)) # print(type(s) is Son) # print(type(s) is Foo) #判断一个类是不是另一类的子类,传两个参数(子类,父类) print(issubclass(So

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

铁乐学python_day24_面向对象进阶1_内置方法

题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面的四个问题,并了解和实践透彻. 什么是反射? 先不说枯燥的概念,你可以自己总结出来,对于python中的反射,什么时候会用到? 需要使用字符串数据类型的变量名来使用变量的时候用到反射. (通过字符串的形式操作对象相关的属性和方法.) 关键词:字符串 使用到字符串的场景多在: 1)文件中存储的是字符串, 2)网络上能传递的也最接近字符串, 3)用户输入的(用