python中hasattr()、getattr()、setattr()函数的使用

本文详细介绍了Python中hasattr(), getattr(), setattr()三个函数的使用方法,包括如何判断对象是否具有特定属性,如何获取属性值,以及如何设置或修改属性值。并通过实例演示了这些函数在类变量和方法上的应用。

引言:

  在阅读高手写的代码时,有很多简写的形式,如果没有见过还真的看不太懂是什么意思,其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法,相关联的hasattr()、getattr()、setattr()函数的使用也一并学习了一下;

   类似于:__import__ 映射机制(动态)(动态生成,动态查找)  

  例如:__import__('os').path(导包的同时使用里面的方法,动态使用)

正文:

  1. hasattr(object, name)

  判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法;有则返回True,没有则返回False;需要注意的是name参数是string类型,所以不管是要判断变量还是方法,其名称都以字符串形式传参;getattr和setattr也同样;

复制代码
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'A()类的方法func()'

    
>>> 
>>> hasattr(A, 'name')
True
>>> 
>>> hasattr(A, 'age')
False
>>> 
>>> hasattr(A, 'func')
True
>>> 
复制代码

  2. getattr(object, name[, default])

  获取object对象的属性的值,如果存在则返回属性值,如果不存在分为两种情况,一种是没有default参数时,会直接报错;给定了default参数,若对象本身没有name属性,则会返回给定的default值;如果给定的属性name是对象的方法,则返回的是函数对象,需要调用函数对象来获得函数的返回值;调用的话就是函数对象后面加括号,如func之于func();

  另外还需要注意,如果给定的方法func()是实例函数,则不能写getattr(A, 'func')(),因为fun()是实例函数的话,是不能用A类对象来调用的,应该写成getattr(A(), 'func')();实例函数和类函数的区别可以简单的理解一下,实例函数定义时,直接def func(self):,这样定义的函数只能是将类实例化后,用类的实例化对象来调用;而类函数定义时,需要用@classmethod来装饰,函数默认的参数一般是cls,类函数可以通过类对象来直接调用,而不需要对类进行实例化;

复制代码
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'

    
>>> 
>>> getattr(A, 'name')
'python'
>>> 
>>> getattr(A, 'age')    # age变量不存在则报错

Traceback (most recent call last):
  File "<pyshell#464>", line 1, in <module>
    getattr(A, 'age')
AttributeError: class A has no attribute 'age'
>>> 
>>> getattr(A, 'age', 20)
20
>>> 
>>> getattr(A, 'func')
<unbound method A.func>
>>> 
>>> getattr(A, 'func')()    # func()函数不能被A类对象调用,所以报错

Traceback (most recent call last):
  File "<pyshell#470>", line 1, in <module>
    getattr(A, 'func')()
TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)
>>> 
>>> getattr(A(), 'func')()
'Hello world'
>>> 

>>> class A(object):
    name = 'python'
    @classmethod
    def func(cls):
      return 'the method of A object.'

>>> 
>>> getattr(A, 'func')()
'the method of A object.'
>>>

复制代码

  3. setattr(object, name, value)

  给object对象的name属性赋值value,如果对象原本存在给定的属性name,则setattr会更改属性的值为给定的value;如果对象原本不存在属性name,setattr会在对象中创建属性,并赋值为给定的value;

复制代码
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'

    
>>> 
>>> setattr(A, 'name', 'java')
>>> getattr(A, 'name')
'java'
>>> 
>>> setattr(A, 'age', 20)
>>> getattr(A, 'age')
20
>>> 
复制代码

 

 

  一般先判断对象中是否存在某属性,如果存在则返回;如果不存在,则给对象增加属性并赋值;很简单的if-else判断:

复制代码
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'

    
>>> 
>>> if hasattr(A, 'age'):
    print getattr(A, 'age')
else:
    setattr(A, 'age', 20)

    
>>> 
>>> getattr(A, 'age')
20
>>> 
复制代码

 转载:https://www.cnblogs.com/zanjiahaoge666/p/7475225.html

引言:

  在阅读高手写的代码时,有很多简写的形式,如果没有见过还真的看不太懂是什么意思,其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法,相关联的hasattr()、getattr()、setattr()函数的使用也一并学习了一下;

 

正文:

  1. hasattr(object, name)

  判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法;有则返回True,没有则返回False;需要注意的是name参数是string类型,所以不管是要判断变量还是方法,其名称都以字符串形式传参;getattr和setattr也同样;

复制代码
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'A()类的方法func()'

    
>>> 
>>> hasattr(A, 'name')
True
>>> 
>>> hasattr(A, 'age')
False
>>> 
>>> hasattr(A, 'func')
True
>>> 
复制代码

  2. getattr(object, name[, default])

  获取object对象的属性的值,如果存在则返回属性值,如果不存在分为两种情况,一种是没有default参数时,会直接报错;给定了default参数,若对象本身没有name属性,则会返回给定的default值;如果给定的属性name是对象的方法,则返回的是函数对象,需要调用函数对象来获得函数的返回值;调用的话就是函数对象后面加括号,如func之于func();

  另外还需要注意,如果给定的方法func()是实例函数,则不能写getattr(A, 'func')(),因为fun()是实例函数的话,是不能用A类对象来调用的,应该写成getattr(A(), 'func')();实例函数和类函数的区别可以简单的理解一下,实例函数定义时,直接def func(self):,这样定义的函数只能是将类实例化后,用类的实例化对象来调用;而类函数定义时,需要用@classmethod来装饰,函数默认的参数一般是cls,类函数可以通过类对象来直接调用,而不需要对类进行实例化;

复制代码
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'

    
>>> 
>>> getattr(A, 'name')
'python'
>>> 
>>> getattr(A, 'age')    # age变量不存在则报错

Traceback (most recent call last):
  File "<pyshell#464>", line 1, in <module>
    getattr(A, 'age')
AttributeError: class A has no attribute 'age'
>>> 
>>> getattr(A, 'age', 20)
20
>>> 
>>> getattr(A, 'func')
<unbound method A.func>
>>> 
>>> getattr(A, 'func')()    # func()函数不能被A类对象调用,所以报错

Traceback (most recent call last):
  File "<pyshell#470>", line 1, in <module>
    getattr(A, 'func')()
TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)
>>> 
>>> getattr(A(), 'func')()
'Hello world'
>>> 

>>> class A(object):
    name = 'python'
    @classmethod
    def func(cls):
      return 'the method of A object.'

>>> 
>>> getattr(A, 'func')()
'the method of A object.'
>>>

复制代码

  3. setattr(object, name, value)

  给object对象的name属性赋值value,如果对象原本存在给定的属性name,则setattr会更改属性的值为给定的value;如果对象原本不存在属性name,setattr会在对象中创建属性,并赋值为给定的value;

复制代码
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'

    
>>> 
>>> setattr(A, 'name', 'java')
>>> getattr(A, 'name')
'java'
>>> 
>>> setattr(A, 'age', 20)
>>> getattr(A, 'age')
20
>>> 
复制代码

 

 

  一般先判断对象中是否存在某属性,如果存在则返回;如果不存在,则给对象增加属性并赋值;很简单的if-else判断:

复制代码
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'

    
>>> 
>>> if hasattr(A, 'age'):
    print getattr(A, 'age')
else:
    setattr(A, 'age', 20)

    
>>> 
>>> getattr(A, 'age')
20
>>> 
posted on 2019-03-11 11:19 **勇敢的心 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lzc978/p/10255628.html

### duck typing - **含义**:鸭子类型是一种编程风格,不关注对象的类型,而是关注对象的行为。如果一个对象走起路来像鸭子,叫起来像鸭子,那么它就是鸭子。 - **示例**: ```python class Duck: def quack(self): print("Quack!") class Person: def quack(self): print("I'm pretending to be a duck!") def make_quack(obj): obj.quack() duck = Duck() person = Person() make_quack(duck) make_quack(person) ``` - **示例解释**:定义了 `Duck` 类和 `Person` 类,都有 `quack` 方法。`make_quack` 函数接受一个对象并调用其 `quack` 方法。无论对象类型是什么,只要有 `quack` 方法就可正常调用。 ### composition - **含义**:组合是一种对象复用的方式,通过将一个对象作为另一个对象的属性,实现功能的组合。 - **示例**: ```python class Engine: def start(self): print("Engine started.") class Car: def __init__(self): self.engine = Engine() def start_car(self): self.engine.start() car = Car() car.start_car() ``` - **示例解释**:定义了 `Engine` 类和 `Car` 类,`Car` 类的实例包含一个 `Engine` 类的实例。`Car` 类的 `start_car` 方法调用 `Engine` 类的 `start` 方法。 ### magic method / dunder method - **含义**:魔法方法(双下划线方法)是 Python 中具有特殊名称(以双下划线开头和结尾)的方法,用于实现类的特殊行为,如运算符重载、对象创建和销毁等。 - **示例**: ```python class Point: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Point(self.x + other.x, self.y + other.y) def __str__(self): return f"Point({self.x}, {self.y})" p1 = Point(1, 2) p2 = Point(3, 4) p3 = p1 + p2 print(p3) ``` - **示例解释**:定义了 `Point` 类,实现了 `__add__` 方法用于重载加法运算符,`__str__` 方法用于返回对象的字符串表示。创建两个 `Point` 类的实例,相加得到新的实例并打印。 ### id - **含义**:`id` 是一个内置函数,用于返回对象的唯一标识符,通常是对象在内存中的地址。 - **示例**: ```python a = [1, 2, 3] print(id(a)) ``` - **示例解释**:创建一个列表 `a`,使用 `id` 函数返回 `a` 的唯一标识符。 ### isinstance - **含义**:`isinstance` 是一个内置函数,用于检查一个对象是否是某个类或类型的实例。 - **示例**: ```python a = [1, 2, 3] print(isinstance(a, list)) ``` - **示例解释**:创建一个列表 `a`,使用 `isinstance` 函数检查 `a` 是否是 `list` 类的实例。 ### issubclass - **含义**:`issubclass` 是一个内置函数,用于检查一个类是否是另一个类的子类。 - **示例**: ```python class Parent: pass class Child(Parent): pass print(issubclass(Child, Parent)) ``` - **示例解释**:定义了 `Parent` 类和 `Child` 类,`Child` 类继承自 `Parent` 类。使用 `issubclass` 函数检查 `Child` 类是否是 `Parent` 类的子类。 ### dir - **含义**:`dir` 是一个内置函数,用于返回对象的所有属性和方法的名称列表。 - **示例**: ```python a = [1, 2, 3] print(dir(a)) ``` - **示例解释**:创建一个列表 `a`,使用 `dir` 函数返回 `a` 的所有属性和方法的名称列表。 ### hasattr - **含义**:`hasattr` 是一个内置函数,用于检查一个对象是否具有指定的属性。 - **示例**: ```python class Person: def __init__(self, name): self.name = name p = Person("Alice") print(hasattr(p, "name")) ``` - **示例解释**:定义了 `Person` 类,创建其实例 `p`。使用 `hasattr` 函数检查 `p` 是否具有 `name` 属性。 ### getattr - **含义**:`getattr` 是一个内置函数,用于获取对象的指定属性的值。 - **示例**: ```python class Person: def __init__(self, name): self.name = name p = Person("Alice") print(getattr(p, "name")) ``` - **示例解释**:定义了 `Person` 类,创建其实例 `p`。使用 `getattr` 函数获取 `p` 的 `name` 属性的值。 ### setattr - **含义**:`setattr` 是一个内置函数,用于设置对象的指定属性的值。 - **示例**: ```python class Person: def __init__(self, name): self.name = name p = Person("Alice") setattr(p, "name", "Bob") print(p.name) ``` - **示例解释**:定义了 `Person` 类,创建其实例 `p`。使用 `setattr` 函数将 `p` 的 `name` 属性的值设置为 `"Bob"`。 ### eval - **含义**:`eval` 是一个内置函数,用于将一个字符串作为 Python 表达式求值。 - **示例**: ```python def dump(expression): result = eval(expression) print(expression, '=>', result, type(result)) dump('1') dump('1.0') dump('1.0+2.0') ``` - **示例解释**:定义了 `dump` 函数使用 `eval` 函数对传入的字符串表达式进行求值,并打印结果和类型[^1]。 ### exec - **含义**:`exec` 是一个内置函数,用于执行存储在字符串或文件中的 Python 代码。 - **示例**: ```python code = "print('Hello, World!')" exec(code) ``` - **示例解释**:定义了一个包含 Python 代码的字符串,使用 `exec` 函数执行该代码。 ### compile - **含义**:`compile` 是一个内置函数,用于将字符串编译成 Python 能识别或执行的代码对象,代码对象可以通过 `exec` 语句执行或 `eval` 函数求值。 - **示例**: ```python s = "print('hello world')" r = compile(s, "<string>", "exec") exec(r) ``` - **示例解释**:将字符串 `s` 编译成代码对象 `r`,使用 `exec` 函数执行代码对象[^2]。 ### hash - **含义**:`hash` 是一个内置函数,用于返回对象的哈希值,哈希值用于在字典等数据结构中快速查找对象。 - **示例**: ```python a = (1, 2, 3) print(hash(a)) ``` - **示例解释**:创建一个元组 `a`,使用 `hash` 函数返回 `a` 的哈希值。 ### help - **含义**:`help` 是一个内置函数,用于获取对象的帮助信息,通常是对象的文档字符串。 - **示例**: ```python help(list) ``` - **示例解释**:使用 `help` 函数获取 `list` 类的帮助信息。 ### super - **含义**:`super` 是一个内置函数,用于调用父类的方法,在子类中重写方法时可以使用 `super` 调用父类的同名方法。 - **示例**: ```python class Parent: def __init__(self): print("Parent __init__") class Child(Parent): def __init__(self): super().__init__() print("Child __init__") c = Child() ``` - **示例解释**:定义了 `Parent` 类和 `Child` 类,`Child` 类继承自 `Parent` 类。在 `Child` 类的 `__init__` 方法中使用 `super` 调用 `Parent` 类的 `__init__` 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值