【问题标题】:python class namespace and init functionpython类命名空间和init函数
【发布时间】:2011-01-05 18:05:44
【问题描述】:
class Complex:
     realpart,imagpart=0,0
     def __init__(self):
          self.r = Complex.realpart
          self.i = Complex.imagpart

x = Complex()

上面的代码有效,x.r,x.i = (0,0),但是当类名很大的时候,Class_name.Data_member 访问类数据的方式看起来很多余,有没有什么办法可以改进类的作用域,所以我不必使用 Complex.imagpart?只需使用 self.r = realpart?

【问题讨论】:

  • 1.不,这不是 Visual Basic。 2、为什么不用内置的complex类型?
  • 可能是不可能的(如果不大幅修改语言,无论如何你都无法实现) - 但是 C = ReallyReallyLongClassName 并改用 C.realpart 怎么样?并考虑它是否应该是一个类级别的常量......(编辑@AdniDog:你错过了重点。VB 不是唯一与 Python 不同范围的语言,类名只是一个 - 尽管不是很好选择 - 示例)
  • 无论如何,在 Python 中缩短语句是没有用的。 C = WayTooLongClassName 是一个解决方案,但我不记得曾经在 Python 中使用过类似的东西。我故意选择VB作为例子,因为那里的语句可能会很长。
  • Python 内置了对复数的支持;你可以使用x = 0+0j

标签: python class namespaces scope


【解决方案1】:

这就是你想要做的:

class Complex(object):
    def __init__(self, realpart=0, imagpart=0):
        self.realpart = realpart
        self.imagpart = imagpart

访问成员变量是“self.realpart”调用。您使用的是类属性,可以这样访问:

Complex.some_attribute

【讨论】:

  • 你好,Complex(object)中的object有什么用?
  • 这是它继承的。所有新式类最终都继承自object。例如,要创建一个从Complex 继承的SuperComplex 类,您可以将其写为class SuperComplex(Complex):
【解决方案2】:

没有。您在上面指定的数据成员是类的属性,因此需要指定类名。如果您愿意,可以使用self.r = self.__class__.realpart。不过,您似乎只是将这些值用作初始化程序,因此完全拥有 realpartimagpart 是多余的。

(另外,请注意 Python 原生支持复数。只需将它们写成 5+3j 即可。)

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2022-12-31
    • 2014-12-13
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多