【问题标题】:Is there another way to get value from object method into object variable是否有另一种方法可以从对象方法中获取值到对象变量中
【发布时间】:2018-06-27 21:34:02
【问题描述】:

我编写了这样的代码

class Dog():
    def breed():
        return "rottwiller"

    def __init__(self, name, age, breed=breed()):
        self.name = name
        self.age = age
        self.breed = breed

是否有另一种方法来实现“self.breed”值而不是breed=breed(),但也可以通过函数方法。

例如类似的东西(我试过这个不起作用):

def __init__(self, name, age):
    self.name = name
    self.age = age
    self.breed = breed()

【问题讨论】:

  • 你能解释一下你在这里想要完成的事情吗?
  • breed 函数的意义何在?如果您更详细地解释您正在尝试做什么,您会得到更有用的回复。
  • @Aran-Fey 英语不是我的第一语言,我使用此代码以便清楚。目的是我想在一个类中有一个变量,当我用值初始化实例时将创建该变量,该值将获得 trought 函数但没有我的输入。我不确定我在这里是否有意义。因此,我将解析实例中的一些参数,对象将使用该参数根据我在对象内部创建的方法创建变量。

标签: python oop variables methods


【解决方案1】:

你不应该把一个属性和一个方法命名为同一个东西。话虽如此,我怀疑你为什么问这个问题告诉我我应该把你指向@property装饰器。

class Dog():
    def __init__(self, name, age, breed):
        self.name = name
        self.age = age
        self._breed = breed

    @property
    def breed(self):
        return self._breed

这对于您的示例来说是多余的,但是如果您有一个 Dog 类和一个特定的品种,我想您正在考虑子类和可能比您在这里做的更复杂的事情。本质上,@property 装饰器将允许您将breed 作为属性访问,并将调用的值返回给您在其下以相同名称定义的函数。

【讨论】:

  • 您需要将 self 添加到品种属性才能使其正常工作。
  • @MatthewStory 我明白你的意思了。对于您在作者之前注意到的答案中的简单错误,我建议按“编辑”按钮而不是“否决”按钮。
  • 我在代码工作时删除了我的反对票,我的回答也因为同样的原因被反对了......:耸肩:
  • @MladenMODD 这个答案和你接受的答案不同,对__init__ 有不同的方法签名。我仍然不确定您的用例是什么
  • 用例稍微复杂一些,但我的对象将参数作为 url 地址并从该地址获取一些数据(生成它经过的方法),然后我想将生成的数据发送到 DB object_name.variable_name 例如 website[0].title_of_a_website 我正在寻找各种方法来实现这一点。
【解决方案2】:

发布的代码存在许多问题。

  1. breed 方法在您设置breed 属性时被__init__ 方法覆盖。所以方法应该重命名。
  2. breed方法需要指定第一个参数self

    类狗: def get_breed(自我): 返回“罗特威勒”

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.breed = self.get_breed()
    

【讨论】:

  • 如果您尝试创建类的实例,此代码甚至不会运行
  • 我试过了,这不起作用:self.breed = self.breed() TypeError:breed()接受0个位置参数,但给出了1个
  • @user3483203 什么代码?矿?确实如此。第二个显示错误,我引用了“self.breed = self.breed() TypeError:breed() 采用 0 个位置参数,但给出了 1 个”
  • 抱歉,我已经更新了代码,现在可以通过将方法名称更改为 get_breed 使其与您要使用的属性名称不冲突,并添加get_breed 方法所需的 self 参数。
  • 我刚刚验证了这段代码有效:Dog("a", "b").breed'rottwiller'
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 2011-08-30
  • 2011-07-30
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 2012-11-06
相关资源
最近更新 更多