1. 不带初始化参数的类

其实 Fire 可以接收一切 Python 对象,那我们使用一个类来看下具体使用方法:

  1. import fire
  2. from typing import Text
  3. class Calculator(object):
  4. """A simple calculator class."""
  5. @staticmethod
  6. def double(number: int) -> int:
  7. """将给定数值乘以 2 后返回
  8. :param number: 数值
  9. :return: int
  10. """
  11. return 2 * number
  12. if __name__ == '__main__':
  13. fire.Fire(Calculator)

也可以将类实例化之后,传给 Fire:

  1. calculator = Calculator()
  2. fire.Fire(calculator)

在终端中使用如下命令进行操作:

  1. $ python calculator.py double 10
  2. 20
  3. $ python calculator.py double --number=15
  4. 30

2. 带有初始化参数的类

如果我们的类带有初始化参数,那么我们如何调用类方法,以及如何传递参数初始值给了类:

  1. import fire
  2. class BrokenCalculator(object):
  3. def __init__(self, offset: int = 1):
  4. self._offset = offset
  5. def add(self, x: int, y: int) -> int:
  6. return x + y + self._offset
  7. def multiply(self, x: int, y: int) -> int:
  8. return x * y + self._offset
  9. if __name__ == '__main__':
  10. fire.Fire(BrokenCalculator)

这里的BrokenCalculator类有一个初始化offset变量(默认为 1),我们采用如下方式来进行传参:

  1. $ python example.py multiply 10 20 --offset=0
  2. 200

如果类的初始化参数变量名与函数变量名一致的,在命令行中调用需要采用如下方式(当然,最好的方式还是不一样)。:

  1. import fire
  2. class BrokenCalculator(object):
  3. def __init__(self, x: int = 1):
  4. self._offset = x
  5. def add(self, x: int, y: int) -> int:
  6. return x + y + self._offset
  7. def multiply(self, x: int, y: int) -> int:
  8. return x * y + self._offset
  9. if __name__ == '__main__':
  10. fire.Fire(BrokenCalculator)

在终端中正确的调用方式:

  1. $ python helloFire.py add 10 20 --x=5
  2. 35
  3. $ python helloFire.py add 10 --y=20 --x=5
  4. 35
  5. $ python helloFire.py add --x=10 --y=20 --x=5 # 这种方式是错误的

再来看一下示例,帮助我们理解:

  1. import fire
  2. class Building(object):
  3. def __init__(self, name, stories=1):
  4. self.name = name
  5. self.stories = stories
  6. def climb_stairs(self, stairs_per_story=10):
  7. for story in range(self.stories):
  8. for stair in range(1, stairs_per_story):
  9. yield stair
  10. yield 'Phew!'
  11. yield 'Done!'
  12. if __name__ == '__main__':
  13. fire.Fire(Building)

可采用如下方式调用类方法:

  1. $ python example.py --name="Sherrerd Hall" --stories=3 climb_stairs 10
  2. $ python example.py --name="Sherrerd Hall" climb_stairs --stairs_per_story=10
  3. $ python example.py --name="Sherrerd Hall" climb_stairs --stairs-per-story 10
  4. $ python example.py climb-stairs --stairs-per-story 10 --name="Sherrerd Hall"

3. 获取属性值

在命令行中,也可以直接获取属性值:

  1. import fire
  2. class Property(object):
  3. def __init__(self, p: int = 1):
  4. self.p = p
  5. self.add()
  6. def add(self):
  7. for i in range(10):
  8. self.p += i
  9. if __name__ == '__main__':
  10. fire.Fire(Property)

获取类属性值示例如下:

  1. $ python helloFire.py p
  2. 46
  3. $ python helloFire.py --p=5 p
  4. 51