← 返回首页
Python3基础教程(三十五)
发表时间:2022-04-07 16:42:09
获取对象信息

1.使用type()

type()函数返回对象对应的Class类型。

2.使用isinstance()

对于class的继承关系来说,使用type()就很不方便。我们要判断class的类型,可以使用isinstance()函数。

3.使用dir()

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list。配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的属性。

实例:

# -*- coding: utf-8 -*-
# @Time : 2022/4/7 16:23
# @File : objectinfo.py
# @Software : PyCharm
class Animal(object):
    def eat(self):
        print('Animal is eating...')
        return


class Human(Animal):

    # 构造方法
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        # 私有属性age
        self.__age = age

    def eat(self):
        print(self.name, " is eating....")


class Dog(Animal):
    def eat(self):
        print('Dog is eating bone now....')


a = Animal()

h = Human('张三', '男', 23)

print(type(h))
print(type(a))
print(type(h) == type(a))
print(isinstance(h, Animal))

print(dir(h))
# 是否有name属性
print(hasattr(h, 'name'))
# 是否有__age属性
print(hasattr(h,'__age'))
# 是否有_Human__age私有属性
print(hasattr(h,'_Human__age'))
# 修改name属性的值
setattr(h,'name','李四')
# 获取name属性的值
print(getattr(h, 'name'))

运行结果:

<class '__main__.Human'>
<class '__main__.Animal'>
False
True
['_Human__age', '__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__', 'eat', 'gender', 'name']
True
False
True
李四

通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。如果可以直接写,就尽量不要用getattr():

# 如果知道对象一定有name属性,应该直接获取属性
print(h.name)
# 不知道对象是否有name属性,尝试获取name属性的值
print(getattr(h, 'name'))

一个正确的用法的例子如下:

def readImage(fp):
    if hasattr(fp, 'read'):
        return readData(fp)
    return None

假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。