- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我从事 Python 科学程序员已有几年了,随着我的程序越来越大,我发现自己遇到了一个特定的问题。我是自学成才的,所以我从来没有接受过任何正式培训,而是花时间真正“正确”地使用 Python 进行编码的“惯例”。
总之,我发现自己总是创建一个 utils.py 文件,我将所有定义的函数存储在我的程序使用的文件中。然后我发现自己将这些功能分组到各自的目的中。我知道的一种对事物进行分组的方法当然是使用类,但我不确定我的策略是否与实际应该使用的类背道而驰。
假设我有一堆功能大致相同:
def add(a,b):
return a + b
def sub(a,b):
return a -b
def cap(string):
return string.title()
def lower(string):
return string.lower()
现在显然这 4 个函数可以看作是做两个不同的目的,一个是计算,另一个是格式化。这是逻辑告诉我要做的事情,但我必须解决它,因为我不想初始化一个与该类对应的变量。
class calc_funcs(object):
def __init__(self):
pass
@staticmethod
def add(a,b):
return a + b
@staticmethod
def sub(a, b):
return a - b
class format_funcs(object):
def __init__(self):
pass
@staticmethod
def cap(string):
return string.title()
@staticmethod
def lower(string):
return string.lower()
通过这种方式,我现在将这些方法“组合”到一个很好的包中,根据它们在程序中的角色,可以更快地找到所需的方法。
print calc_funcs.add(1,2)
print format_funcs.lower("Hello Bob")
话虽如此,我觉得这是一种非常“unpython-y”的做事方式,而且感觉很困惑。我是想以正确的方式思考还是有其他方法?
最佳答案
另一种方法是制作一个 util
package 并将您的函数拆分为该包中的不同模块。包的基础知识:创建一个目录(其名称将是包名)并在其中放入一个特殊文件,即 __init__.py
文件。这个可以包含代码,但是对于基本的包组织,它可以是一个空文件。
my_package/
__init__.py
module1.py/
modle2.py/
...
module3.py
假设你在你的工作目录中:
mkdir util
touch util/__init__.py
然后在你的 util
目录中,制作 calc_funcs.py
def add(a,b):
return a + b
def sub(a,b):
return a -b
还有format_funcs.py
:
def cap(string):
return string.title()
def lower(string):
return string.lower()
现在,在您的工作目录中,您可以执行以下操作:
>>> from util import calc_funcs
>>> calc_funcs.add(1,3)
4
>>> from util.format_funcs import cap
>>> cap("the quick brown fox jumped over the lazy dog")
'The Quick Brown Fox Jumped Over The Lazy Dog'
但请注意,如果我们重新启动解释器 session :
>>> import util
>>> util.format_funcs.cap("i should've been a book")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'util' has no attribute 'format_funcs'
这就是 __init__.py
的用途!
在 __init__.py
中,添加以下内容:
import util.calc_funcs, util.format_funcs
现在,再次重启解释器:
>>> import util
>>> util.calc_funcs.add('1','2')
'12'
>>> util.format_funcs.lower("I DON'T KNOW WHAT I'M YELLING ABOUT")
"i don't know what i'm yelling about"
耶!我们可以通过轻松导入灵活地控制我们的命名空间!基本上,__init__.py
的作用类似于类定义中的 __init__
方法。
关于python - 在 Python 中使用类对函数进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38758668/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!