精华内容
下载资源
问答
  • Python获取对象的属性

    2019-08-02 16:41:18
    判断一个变量是否是某个类型可以用isinstance()判断: isinstance(变量,类型) ...获取一个对象的类型: type(对象) 获得一个对象的所有属性和方法,可以使用函数: dir(对象) 通过getattr()、seta...

    判断一个变量是否是某个类型可以用isinstance()判断:     isinstance(变量,类型)

    获取一个对象的类型:                                                            type(对象)

    获得一个对象的所有属性和方法,可以使用函数:                  dir(对象)

    通过getattr()setattr()以及hasattr(),我们可以直接操作一个对象的状态 :

    >>> hasattr(obj, 'y') # 有属性'y'吗?
    False
    >>> setattr(obj, 'y', 19) # 设置一个属性'y'
    >>> hasattr(obj, 'y') # 有属性'y'吗?
    True
    >>> getattr(obj, 'y') # 获取属性'y'
    19
    >>> obj.y # 获取属性'y'
    19
    >>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
    404

     

    展开全文
  • time = Time(9,45) for attr in vars(time): print(attr,getattr(time,attr)) 输出: hour 9 minute 45 second 0
    time = Time(9,45)
    for attr in vars(time):
        print(attr,getattr(time,attr))
    
    

    输出:

    hour 9
    minute 45
    second 0

     

    展开全文
  • 工作中,我们使用一些之前没用到过模块,使用时需要了解一下这个模块中一些类方法或属性,怎么做呢?目前我比较常用两款IDE“Pycharm”和“VSCode”,都可以通过先导包,然后通过“Ctrl+鼠标左键”,进入...

    工作中,我们使用一些之前没用到过的模块,使用时需要了解一下这个模块中的一些类的方法或属性,怎么做呢?目前我比较常用的两款IDE“Pycharm”和“VSCode”,都可以通过先导包,然后通过“Ctrl+鼠标左键”,进入源码后观看并膜拜一下大神们的代码,当然也可以进入我们在项目中自己所定义的,然后进行快速修改,真的是很方便呢。但是有的时候,我们使用的环境没有这类的IDE,那该怎么学习我们要用的这些类方法和属性呢?方法当然很多,无论是小白,还是大神,百度谷歌大法都是比较快速和方便的。但是对于一些刚开源的或者是我们自己定义的呢,这里我们就聊聊Python 中的内建函数——dir 函数

    首先可以先通过简单的源码解读,可以得知:

    1.他的返回值是一个元素为字符串的列表

    2.当传入一个模块对象时,返回的是模块里面所有的属性(变量名和方法)

    我在function_use 这个文件夹或者包中创建了一个模块(demo01.py),内容随便定义几个变量和函数及类,如:

    a = 10
    b = 'test'
    
    def c(x):
        print(x)
    
    class D(object):
        def __init__(self):
            self.name = 'name'
            self.age = 18
    
        def get_name(self):
            return self.name
    
    class E(D):
        pass

    然后再创建一个模块(demo02.py),并在"demo02.py"中引用"demo01.py“,然后打印dir(demo01),如:

    from function_use import demo01
    
    print(dir(demo01))

    运行结果如下:
    ['D', 'E', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b', 'c']

    3.当传入的对象是一个类时,返回这个类及其所有父类(包括父类的父类)的属性和方法

    就上面的例子,无论是在当前模块“demo01.py”下面调用:

    if __name__ == '__main__':
        print(dir(D))

    运行如下:

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

    4.当传入的对象是其他的时候(照我的理解,这个其他对象,就是一个实例对象),则返回这个实例对象的属性和方法,实例对象类的属性和方法,以及这个类的所有基类的属性和方法

    相对于第三种情况(传入的对象是一个类时)其实只是多了这个实例对象的属性,感觉绕的话,就看下面的例子:
    老样子,在”demo01.py“ 里面

    if __name__ == '__main__':
        e = E()
        print(dir(e))

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

    可以看到,只是多了E 的实例对象的两个属性“age” 和“name”

    ===================问题分割线===================

    这里就有一个待解决的问题,就上面的例子,我尝试了在demo01.py 模块的D 这个类里面加了一个类方法及类属性

    a = 10
    b = 'test'
    
    
    def c(x):
        print(x)
    
    
    class D(object):
        dd = 123
    
        def __init__(self):
            self.name = 'name'
            self.age = 18
    
        def get_name(self):
            return self.name
    
        @classmethod
        def print_x(cls):
            print("x")
    
    
    class E(D):
        pass
    
    
    if __name__ == '__main__':
        # e = E()
        # print(dir(e))
        print(dir(E))
        E.print_x()
        # print(E.get_name())
    
    
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'dd', 'get_name', 'print_x']
    
    x # E.print_x()

     

    这都没问题,但是我去调用dir 函数返回的“get_name” 函数时,却提示我必须要传入一个必传的参数“self”这样就需要
    print(E.get_name(E()))了,但是这样的话,为什么这个方法可以出现在dir(E)的返回值里面呢?
    有点晕
    ===================问题分割线===================

     

     

    说完这个函数的返回值,我们再聊聊其中具体的内容,这里用自定义的例子不好说明,就搬来廖老师的例子吧

    首先对一个字符串对象,比如“ABC” 使用dir()函数,查看他的所有属性和方法

    print(dir("ABC"))
    
    ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

    可以看出来,字符串对象的属性和方法还是很多的,类似__xx__的属性和方法在Python 中都是有特殊用途的,比如__len__方法返回长度。在Python 中,如果你调用len() 函数试图获得一个对象的长度,实际上,在len() 函数内部,它自动去调用该对象的__len__() 方法,所以得到两个结论:

    1.下面的代码是等价的

    1 print(len("ABC")) # 3
    2 print("ABC".__len__()) # 3

     

    2.对一个对象使用dir 函数,返回的列表里面,如果没有__len__ 方法,我们去对这个对象使用len 函数,就会报TypeError 的错

    比如对整数类型使用len 函数,或者是上面我们"demo01.py" 里面的"e" 使用len 函数,如果我们想用len(e) 的话,就要自己写一个__len__() 方法:

    class D(object):
        dd = 123
    
        def __init__(self):
            self.name = 'name'
            self.age = 18
    
        def __len__(self):
            return 100
    
        def get_name(self):
            return self.name
    
        @classmethod
        def print_x(cls):
            print("x")
    
    
        class E(D):
            pass
    
    if __name__ == '__main__':
        e = E()
        print(len(e))         # 100

    除了这些“__xx__” 特殊格式的方法,剩下的都是普通属性或方法,比如lower() 返回小写的字符串

    展开全文
  • python获取对象属性的方法
    import random
    # 定义Person类
    class Person:
    	def __init__(self, id, gender, age):
    		self.id = id
    		self.gender = gender
    		self.age = age
    		
    # 连续创建2个Person对象
    p1 = Person(1, '男', 23)
    p2 = Person(2, '女', 22)
    
    #------方法1:对象名.属性名
    
    # 获取第1个对象的编号
    print(p1.id)
    # 获取第1个对象的性别
    print(p1.gender)
    # 获取第1个对象的年龄
    print(p1.age)
    
    #------方法2:以字典方式查看对象的所有属性和属性值
    
    # 查看第2个对象的所有属性和属性值
    print(p2.__dict__)

    运行结果:

    1
    男
    23
    {'id': 2, 'gender': '女', 'age': 22}
    
    展开全文
  • 主要介绍了Python获取对象属性的几种方式小结,具有很好参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 本文主要介绍了如何在Python中动态获取对象的属性和方法,并运行使用它们,需要的朋友可以参考一下
  • Python获取对象属性的4种方法

    万次阅读 2018-11-19 10:23:43
    本文将简单介绍四种获取对象的方法。 假如有以下的类: class Person(object): def __init__(self, name, age): self.name = name self.age = age def __str__(self): return 'name=%s, age=%s' ...
  • python动态获取对象的属性和方法

    千次阅读 2016-06-23 15:58:19
    python动态获取对象的属性和方法  首先通过一个例子来看一下本文中可能用到的对象和相关概念。 01 #coding: UTF-8 02 import sys # 模块,sys指向这个模块对象 03 import inspect 04 def foo(): pass # ...
  • python getattr获取对象属性

    千次阅读 2015-11-30 16:04:59
    getattr是一个很强大的功能,它能够获取任何对象...甚至用它还可以获取只有在运行才知道的属性。如, >>> li = [1,2,3,4] >>> getattr(li, 'append')(5) >>> li [1, 2, 3, 4, 5]  以上通过getattr函数获取了lis
  • Python帮助函数调试函数 用于获取对象的属性及属性值刚接触Python,上篇 《Python入门》第一个Python Web程序——简单的Web服务器 中调试很不方便,不知道对象具体有什么属性,包含什么值,所以写了一个函数,用于...
  • 如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list。 小结 通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,679
精华内容 671
关键字:

python获取对象的属性

python 订阅