【问题标题】:take variable in constructor of class und modifying python在类的构造函数中获取变量并修改python
【发布时间】:2018-10-06 12:55:20
【问题描述】:

如何访问位于类构造函数中的变量的值?

代码是

class Rectangle:
    count = 0

    def __init__(self,width, height):
        self.width = width
        self.height = height


        bla = 10
        Rectangle.count += 1

        default_area = 20

    def calcArea(self):
        area = self.width * self.height
        return area

    def getcount(self):
        print(self.count)

我要修改default_area;我该怎么做?

【问题讨论】:

  • 如此写,它是一个局部变量并且消失了,所以你不能访问它。您可以将其提升为实例或类变量,然后您可以访问它。 (谷歌它。)然而,虽然 Python 允许这样做,但它不是很好 OOD 。 . .语言允许,但如果我们一起进行代码审查,我会抱怨它。 . .我希望您对此有充分的理由,并且可能会要求您将其推广到具有完整获取/设置支持的界面。
  • 你打算如何使用这个变量?该类是否只有一个,或者每个实例都有自己的default_area?如果是默认值,为什么要更改它?
  • Prune - 我见过这种用于测试的东西。在默认/生产中它执行 X,但对于测试它执行 Y;可能访问模拟而不是服务器。让我的皮肤爬行。 . .三年后,当它在生产中被其他团队成员滥用时,只是一个等待发生的错误。

标签: python class oop constructor


【解决方案1】:

如果您希望所有实例共享相同的default_area,请将其提升为类属性:

class Rectangle:
    count = 0
    default_area = 20

# Modify
Rectangle.default_area = 30

如果您希望每个实例都有自己的,请将其设为类属性(如之前的帖子所述):

def __init__(self,width, height):
    self.width = width
    self.height = height
    self.default_area = 20

# Modify
rect1.default_area = 30

如果您希望这是一个真正的默认值,请在构造函数中设置:

def __init__(self,width, height, area=20):
    self.width = width
    self.height = height
    self.area = area

# Modify
rect1.area = 30

【讨论】:

    【解决方案2】:

    您可以通过以下方式将变量与类关联: self.default_area = 20。然后您可以通过self.default_area 访问它。变量bladefault_area 定义在类构造函数的本地函数范围内,并且由于它们不再具有引用而被垃圾收集。当变量没有引用时,它不能被访问。 CalcArea 中的变量 area 可以直接返回结果。

    #!/usr/bin/env python
    
    class Rectangle:
        def __init__(self, width, height):
            self.Width = width
            self.Height = height
    
            self.default_area = self.CalcArea()
    
        def CalcArea(self):
            return self.Width * self.Height
    
        def GetInfo(self):
            print("X:", self.Width)
            print("Y:", self.Height)
            print("Area:", self.default_area)
    
    rect1 = Rectangle(10, 20)
    rect1.GetInfo()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-16
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多