【问题标题】:__call__ vs. __init__: Who gets the arguments? Who gets called first? [duplicate]__call__ vs. __init__:谁得到了论据?谁先被叫到? [复制]
【发布时间】:2012-09-15 06:50:33
【问题描述】:

可能重复:
what is difference between init and call in python?

我正在尝试创建一个可调用的类,该类将接受参数,然后将自身作为对象返回。

class User(object):
    def __init__(self, loginName, password):
        self.loginName = loginName

    def __call__(self):
        if self.login():
            return self
        return None

    def login(self):
        database = db.connection
        realUser = database.checkPassWord(self.loginName, self.password)
        return realUser

我的问题是,如果我这样称呼这个对象:

newUserObject = User(submittedLoginName)

__init__ 会在__call__ 之前被调用吗? __init__ 应该得到论点还是应该将论点转移到 __call__ 之类的

def __call__(self, loginName):

【问题讨论】:

  • 这并不能回答我的问题...我试图了解它们之间的关系,而不仅仅是“有什么区别”
  • @yourfriendzak 我认为您需要一个客户调用的工厂函数——这样他们就不需要知道User 类。无论如何,如果您的 User 类必须自己登录然后响应您的客户的进一步呼叫,那么它的责任太多了。
  • @quamrana 你说得对...我要删除 call 并只使用 init

标签: python class


【解决方案1】:

__call__ 仅在将自身定义为可调用的实例上调用。

__init__ 是提供类实例的初始化器

如果你这样做

MyObject()() 那么你正在初始化 THEN 调用。

使用你自己的例子

class User(object):
    def __init__(self, loginName, password):
        self.loginName = loginName
        self.password = password

    def __call__(self):
        if self.login():
            return self
        return None

    def login(self):
        database = db.connection
        return database.checkPassWord(self.loginName, self.password)

a = User("me", "mypassword")
a = a() # a is now either None or an instance that is aparantly logged in.

【讨论】:

  • 你能改变你的例子,让类 User 将返回一个具有所有相同参数的初始化对象吗?这就是我想要做的。
  • @yourfriendzak:也许您应该将此标记为答案,并提出另一个问题,详细说明“返回具有所有相同参数的自身初始化副本”的含义
  • @yourfriendzak 你的设计似乎有点尴尬。
  • @JakobBowyer 我在这里尽我所能。现在我看着它,我认为我的 call 是不必要的。我可以在初始化时将参数传递给类。
  • @yourfriendzak 正确,将它们作为参数传递,然后获取 .login() 以在失败时引发异常。离开前记得标记为答案。
猜你喜欢
  • 1970-01-01
  • 2014-02-06
  • 2011-03-14
  • 2010-10-16
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多