Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于类实例化程序的pythonic方法是什么_Python - Fatal编程技术网

基于类实例化程序的pythonic方法是什么

基于类实例化程序的pythonic方法是什么,python,Python,我有以下计划: class MyClass(object): def __init__(self): pass def hello(self): print ("hello") if __name__ == "__main__": a = MyClass() a.hello() 它也可以作为 class MyClass(object): def __init__(self): self.hello()

我有以下计划:

class MyClass(object):
    def __init__(self):
        pass
    def hello(self):
        print ("hello")

if __name__ == "__main__":
    a = MyClass()
    a.hello()
它也可以作为

class MyClass(object):
    def __init__(self):
        self.hello()
    def hello(self):
        print ("hello")

if __name__ == "__main__":
    MyClass()
在python方面,是否有理由选择一种样式而不是另一种样式(个人偏好之外)?换句话说:在
\uuuu init\uuuu
内处理程序通用流和逻辑与在类外处理该流相比,是否有优势/劣势


该代码旨在作为独立脚本运行,与上面的示例非常相似,只是更复杂。

我理解您的示例只是为了说明您的观点,而不是因为您想打印“hello”并且需要一个类来打印;)


如果文件中的文件名表明该文件也适合导入。您希望类在实例化时总是打印“hello”吗?通常情况下,行为在方法中,而
\uuuu init\uuuu
只包含初始化。

你可以问自己:如果我实例化这个类的100个实例,这仍然是我想要的行为吗

很容易将这个对象应该执行的所有操作加载到一个方法中,例如init(self),以使主方法尽可能短。只要这是您的私人脚本,就没有必要选择其中一个


但是,一旦代码被共享,或者类被另一个脚本导入,您就可以通过使init()只执行一些必要的初始化命令来提高可重用性。

我发明了另一个示例,它展示了使用第二种样式的类的动机。显然,这是大规模的过度设计,它所做的。让我们假设,除了您的调用之外,还有其他一些代码将使用该类执行一些操作,而不仅仅是调用一个函数,因此这个复杂的接口是合理的

class MyClass(object):
    def __init__(self):
        self.get_config()
        self.validate_config()
        self.hello()
    def get_config(self):
        self.message = "hello"
    def validate_config(self):
        # I'm not claiming this is good practice, just
        # an example of multiple methods that share state
        if not self.message:
            raise Exception()
    def hello(self):
        print(self.message)

if __name__ == "__main__":
    MyClass()
我们这里有什么?基本上,您使用对
MyClass
的调用不是为了创建一个对象(尽管它确实这样做了,并且您放弃了它),而是为了执行对象的
\uuuu init\uuu
方法。当然,它是有效的,但它不是“自然的”。很自然,如果你想运行“一些东西”,你可以调用一个包含这些东西的函数。你不会特别希望它返回一些你根本不关心的对象。如果stuff需要维护一些状态来完成其工作,那么函数可以处理这些,您不需要它在最后向您显示状态:

class MyClass(object):
    def __init__(self):
        self.get_config()
        self.validate_config()
    def get_config(self):
        self.message = "hello"
    def validate_config(self):
        # I'm not claiming this is good practice, just
        # an example of multiple methods that share state
        if not self.message:
            raise Exception()
    def hello(self):
        print(self.message)

def main():
    MyClass().hello()

if __name__ == "__main__":
    main()
这看起来更像你的第一种风格,而不是第二种,所以从这个意义上说,我更喜欢第一种


拥有一个
main
函数可能会使在某种工具(如Python提示符或测试工具)下使用模块变得更容易一些。不过,没必要。如果有人想像
\uuuu name\uuuu='\uuuu main\uuuu'
那样做,那么最坏的情况是他们可以复制该源代码。

好吧,你可以在这里解决不同的问题。通常,创建对象的目的不是让它触发某些东西然后消失(这更像是函数的工作)。相反,您通常希望对象留在周围,并与之交互。因此,您肯定希望将对象引用保存在变量中:

obj = MyClass()
接下来,您应该考虑是否应该在创建对象时始终调用某个对象。如果是这种情况,那么是的,您可能应该将其放入
\uuuu init\uuuu
中。如果即使是很小的情况也不正确,那么您可能应该将其分离,以便能够分别执行初始化和该操作

你的例子显然很简单,所以一开始就没有多大意义。但通常情况下,我会将
hello
视为一个公共API,在拥有该类型的对象时,我可能会调用它。另一方面,我不希望在创建对象时自动调用它


在某些情况下,类似这样的内容可能是有用和需要的,但一般来说,您更喜欢显式地调用该方法。

为什么要为此使用类?后者在语义上是错误的,因为构造函数不应该在初始化对象的情况下做任何额外的工作。如果你真的想避免额外的一行,你可以使用
MyClass().hello()
@user2357112:为什么不呢?该程序显然更复杂,函数之间引用了
self
变量(以及其他变量)。请参阅。如果必须在
init
中调用
pass
,则它不应该是一个类。。。(@unutbu-我试图找到那个视频:-p)还有,是的,这是说明我的问题的最小代码:)我总是在我的代码中加入
if uuuuuu name_uuuuu==“uuuu main_uuuu”:
条件,主要是为了在视觉上隔离实际的程序-即使以后没有计划导入。@WoJ对,所以初始化类的东西——包括为了整洁而放在方法中的代码——进入构造函数,它的行为进入其他人调用它的方法。