Python类编程、getattr、setattr、hasattr、*args、**kwargs、fire工具使用

一、Python 面向对象编程

Python 面向对象编程

二、getattr(obj , name[,default])

返回一个对象的属性值, getattr(obj , name[,default])相当于obj.name

object – 对象。
name – 字符串,对象属性。
default – 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。

1、获取类的属性值

>>>class A(object):
...     bar = 1
... 
>>> a = A()
>>> getattr(a, 'bar')        # 获取属性 bar 值
1
>>> getattr(a, 'bar2')       # 属性 bar2 不存在,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'bar2'
>>> getattr(a, 'bar2', 3)    # 属性 bar2 不存在,但设置了默认值
3
>>>

2、通过字符串直接使用某个包下的模型

在这里插入图片描述

现在源文件夹(getattr_test)下有models包(文件夹下加入__init__.py,则该文件件就是一个Python的包),现在要做的是在test.py 中导入AlexNet.py 中的AlexNet类,并用它新建实例
各个文件内容:
(1)init.py
可以理解为从当前文件夹下的 AlexNet.py 中导入 AlexNet 类,后面test查找models包时会去读取这个包下的 init.py
在这里插入图片描述
(2)AlexNet.py
写了一个用来验证是否导入正确的函数
在这里插入图片描述
(3)test.py
getattr 在这里的用法是(包名 , 包下py文件中的类名) ,第三行与下面这种写法是等价的

model = models.AlexNet()

在这里插入图片描述
在这里插入图片描述

这样的导入写法可能看起来会很繁琐,但当一个包下的文件更多时候的,这意味着我们可以通过字符串直接使用指定的模型,而不必再使用判断语句,也不必在每次增加模型后都去修改代码,只需修改__init__.py ,增加一行导入本文件夹下某个文件中的类即可。

三、setattr(object, name, value)

setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的。

object – 对象。
name – 字符串,对象属性。
value – 属性值。

例一:对已存在的属性进行赋值:
>>>class A(object):
...     bar = 1
... 
>>> a = A()
>>> getattr(a, 'bar')          # 获取属性 bar 值
1
>>> setattr(a, 'bar', 5)       # 设置属性 bar 值
>>> a.bar
5

例二:如果属性不存在会创建一个新的对象属性,并对属性赋值

>>>class A():
...     name = "runoob"
... 
>>> a = A()
>>> setattr(a, "age", 28)
>>> print(a.age)
28
>>>

四、hasattr(object, name)

hasattr() 函数用于判断对象是否包含对应的属性。
object – 对象。
name – 字符串,属性名。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Coordinate:
    x = 10
    y = -5
    z = 0
 
point1 = Coordinate() 
print(hasattr(point1, 'x'))
print(hasattr(point1, 'y'))
print(hasattr(point1, 'z'))
print(hasattr(point1, 'no'))  # 没有该属性

out:
True
True
True
False

五、*args 和 **kwargs

转 : p y t h o n 解 包 \color{red}{转: python 解包} :python

解包
*和 **用于解包字典时的不同:

  • 解包得到字典的key ,**把字典解包成 key=value 的格式

1、*args的使用方法

*args 用来将参数打包成tuple给函数体调用

def function(*args):
    print(args, type(args))

function(1)

输出:
在这里插入图片描述

def function(x, y, *args):
    print(x, y, args)

function(1, 2, 3, 4, 5)

输出:
在这里插入图片描述

2、**kwargs的使用方法

**kwargs 打包关键字参数成dict给函数体调用
例一:

def function(**kwargs):
    print( kwargs, type(kwargs))

function(a=2)

输出:
在这里插入图片描述

例子二:

def function(**kwargs):
    print(kwargs)

function(a=1, b=2, c=3)

输出:
在这里插入图片描述
注意点:参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。

def function(arg,*args,**kwargs):
    print(arg,args,kwargs)

function(6,7,8,9,a=1, b=2, c=3)

输出:
在这里插入图片描述

六、命令行工具 fire

简单总结用法就是:

python  file_name  <fuction>  [args,]   {--kwargs}

更多具体使用方法可以参考下面这篇文章

参考文章

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Systemd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值