【问题标题】:Datetime module in pythonpython中的日期时间模块
【发布时间】:2021-04-29 20:37:52
【问题描述】:

我对以下两个代码有一个理论问题。第一个有效,第二个无效。

import datetime 

c = datetime.datetime.now()
print(c.day, c.month, c.year)
class X: 

    def __init__(self, n,c):
        self.name = n
        self.color = c 

    def initiator(self,n ,c ):
        self.__init__(n, c)
        return self.name, self.color

o = X()
r = o.initiator("John","yellow")
print(r.name, r.color)

我想知道为什么我不能在第二个代码中的变量 r 中分配函数的返回值,就像我认为在第一个代码中所做的那样。有没有办法做到这一点?

谢谢

【问题讨论】:

    标签: python class oop variables theory


    【解决方案1】:

    这正是python创建类的方式

    以下工作。

    class X: 
        def __init__(self, n,c):
            self.name = n
            self.color = c 
    
        def get_name_and_color(self): # initiator shadows the init function as a name
            return self.name, self.color
    
    o = X("John","yellow")
    r_name, r_color = o.get_name_and_color()
    print(r_name, r_color)
    

    请注意我们在创建类时如何使用参数。 此外,很高兴知道您可以返回更多以逗号分隔的值。这样您就可以通过正确的名称直接使用它们。

    【讨论】:

    • 非常感谢您的回答!我的重点是真正了解 datetime 包是如何工作的。我不知道这个多重回报,太好了!
    【解决方案2】:

    我可能错过了您的问题的重点,但在我看来,您正在尝试将方法 initiator 设置为自定义构造函数。为什么?类名已经是构造函数了。

    o = X("John", "yellow")
    print(o.name, o.color)     # John yellow
    

    Python 故意不提供一种明显的方式来定义多个构造函数。

    您与datetime.datetime.now() 的类比并不重要。 now() 不是构造函数:它是返回实例的类方法。你可以像这样得到同样的效果:

    class X:
        def __init__(self, n, c):
            self.name = n
            self.color = c
    
        @classmethod
        def initiator(cls, n ,c ):
            return = cls(n, c) # return a class instance
    
    r = X.initiator("John", "yellow")
    print(r.name, r.color)     # John yellow
    

    通过这个人为的示例,很难理解您为什么要这样做,但是根据 datetime.datetime.now() 的类比,它是不确定的或不是“纯粹的”,因为它的结果不仅仅取决于输入参数,您可以将此添加到 X 类:

        @classmethod
        def me(cls):
            return cls(os.environ["USERNAME"], os.environ["COMPUTERNAME"])
    

    然后

    r = X.me()
    print(r.name, r.color)     # JoaoPedroMatias SOMEAWESOMEBOX
    

    【讨论】:

    • 非常感谢您的回答!我的重点是真正了解 datetime 包是如何工作的,这让我很困惑,但我做得更好。我会试着找出这个包的代码。
    • 如果你想知道为什么now()datetime.datetime 的类方法而不是datetime 的模块函数,你不会是第一个。
    猜你喜欢
    • 2020-05-09
    • 2010-10-28
    • 2011-11-20
    • 2014-01-08
    • 2020-08-25
    • 1970-01-01
    • 2018-06-13
    • 2012-08-18
    相关资源
    最近更新 更多