Python知识

  • 反射
  • 内置方法


反射

python是动态语言,而反射(reflection)机制被视为动态语言的关键。

反射机制指的是在程序的运行状态中:

  • 对于任意一个类,都可以知道这个类的所有属性和方法;
  • 对于任意一个对象,都能够调用他的任意方法和属性。

这种动态获取程序信息以及动态调用对象的功能称为反射机制。

在python中实现反射非常简单,在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式。

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


obj = People('we', 29)
print(dir(obj))

'''
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', 
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', 
'__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
 'age', 'name']
'''

接下来就是想办法通过字符串来操作对象的属性了,这就涉及到内置函数hasattr、getattr、setattr、delattr的使用了(Python中一切皆对象,类和对象都可以被这四个函数操作,用法一样)

hasattr:判断对象中是否有某个属性
getattr:获取对象中的某个属性
setattr: 修改对象中某个属性
delattr:删除对象中的某个属性

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


obj = People('we', 29)

print(hasattr(obj, 'name'))
print(getattr(obj, 'name'))
setattr(obj, 'name', 'egon')
print(getattr(obj, 'name'))

'''
True
we
egon

'''

例子:
通过用户输入的字符串,调用类中对应的功能

class Ftp:
    def put(self):
        print('正在执行上传功能')

    def get(self):
        print('正在执行下载功能')

    def interactive(self):
        method = input('>>>:').strip()

        if hasattr(self, method):
            getattr(self, method)()
        else:
            print('输入的指令不存在')


obj = Ftp()
obj.interactive()
'''
>>>:put
正在执行上传功能
'''

内置方法

定义在类内部以__开头__结尾的方法
特点:会在某种情况下自动触发执行

以常用的__str__和__del__为例来简单介绍它们的使用。

如何使用内置方法
__str__方法会在对象被打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型

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

    def __str__(self):
        return '<%s:%s>' % (self.name, self.age)


obj = People('we', 29)
print(obj)

'''
<we:29>
'''

__del__会在对象被删除时自动触发。由于Python自带的垃圾回收机制会自动清理Python程序的资源,所以当一个对象只占用应用程序级资源时,完全没必要为对象定制__del__方法,但在产生一个对象的同时涉及到申请系统资源(比如系统打开的文件、网络连接等)的情况下,关于系统资源的回收,Python的垃圾回收机制便派不上用场了,需要我们为对象定制该方法,用来在对象被删除时自动触发回收系统资源的操作.

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age
		# self.x =占据的是操作系统资源
    def __str__(self):
        return '<%s:%s>' % (self.name, self.age)

    def __del__(self):
        # 发起系统调用,告诉操作系统回收相关的系统资源
        # self.x.close()


obj = People('we', 29)
print(obj)