文章目录
一、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}
更多具体使用方法可以参考下面这篇文章