我对python很新,并注意到这些帖子: Python __init__和self他们做了什么?和 Python类没有使用def __init __(self)
然而,在玩完它之后,我注意到这两个类别给出了明显相同的结果 -
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
Run Code Online (Sandbox Code Playgroud)
(来自这个问题)
和
class B(object):
x = 'Hello'
def method_b(self,foo):
print self.x + ' ' + foo
Run Code Online (Sandbox Code Playgroud)
这两者之间有什么真正的区别吗?或者,更一般地说,是否确实__init__改变了关于类的属性的任何内容?在文档中提到了__init__在创建实例时调用的文档.这是否意味着在实例化之前建立x了类B?
我已经成为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()
Run Code Online (Sandbox Code Playgroud)
现在显然这4个函数可以看作是两个单独的目的,一个是计算,另一个是格式化.这就是逻辑告诉我要做的事情,但我必须解决它,因为我不想初始化对应于类evertime的变量.
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()
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我现在将这些方法"组合"成一个很好的包,可以根据它们在程序中的角色更快地找到所需的方法.
print calc_funcs.add(1,2)
print format_funcs.lower("Hello Bob")
Run Code Online (Sandbox Code Playgroud)
然而,话虽如此,我觉得这是一种非常'unpython-y'的做事方式,它只是感觉凌乱.我是想以正确的方式思考这个还是有另一种方法?