【问题标题】:Using an attribute as argument of a method of the same class使用属性作为同一类的方法的参数
【发布时间】:2020-04-29 03:38:04
【问题描述】:

我想定义一个类的属性,然后用它作为同一个类中方法的参数,方法如下

class Class1:
    def __init__(self,attr):
        self.attr=attr
    def method1(self,x=self.attr):
        return 2*x


返回错误:NameError: name 'self' is not defined

我怎样才能以这样一种方式定义方法,即每当我不明确写 x 时,它只使用属性 attr

在示例中,我的意思是我想拥有

cl=Class1()
print cl.method1(12) # returns '24'
cl.attr= -2
print cl.method1() # returns '-4'

【问题讨论】:

  • 你不能只设置一个默认值,如果参数等于默认值然后分配self.attr的结果?
  • 您必须在 method1 中定义 attr 才能使用它,您可以删除 x=self.attr 作为将 x 定义为其地址位置的 arg。

标签: python class methods attributes


【解决方案1】:

这是因为在方法 1 中,您只需在第一个参数中定义 self 变量。而 self 变量只能在函数体中使用。 您可能认为self 是一个特殊的关键字。实际上self 只是一个正常的变量,就像其他任何变量一样。

解决问题: 在函数定义中使用默认值并在函数体中检查:

class Class1:
    def __init__(self):
        self.attr = 3

    def method1(self, x=None):
        x = self.attr if x is None else x
        return 2*x


cl = Class1()
print(cl.method1(12))
cl.attr=-2
print(cl.method1())

结果:

24
-4

【讨论】:

    【解决方案2】:

    在您的代码中,您似乎将 x 命名为您传递给函数的参数,而实际上您正在为 init 函数提供值,请尝试以下代码:

    class Class1:
        def __init__(self,attr = 3):
            self.attr=attr
        def method1(self):
            y = (self.attr)*(2)
            return y
    

    当你调用函数时,你应该这样做:

    result = Class1(4)
    print(result.method1())
    
    >>8
    

    P.T.我是 Python 的新手,所以不要理所当然地给出我的答案,或者认为这是解决问题的最佳方法。

    【讨论】:

    • 我的问题是我希望在需要时仍然能够在课堂外提供method1 一些其他参数。
    • 像 n 数量的数字相乘吗?如果是这种情况,您应该在 init 函数中使用 *args 语法。
    • 当参数应该是self.attr 时,我只想写cl.method1(),但也可以在任何其他情况下显式地写参数。 (我看到下面有人给出了可能的解决方案)。
    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2010-11-13
    • 2020-10-01
    • 2020-07-22
    相关资源
    最近更新 更多