【发布时间】:2012-07-07 20:37:13
【问题描述】:
我写了一段代码,模拟abc模块和properties的使用。但是,我似乎无法访问width 和height 变量。代码如下:
from abc import ABCMeta, abstractmethod
class Polygon:
__metaclass__ = ABCMeta
@abstractmethod
def compute_area(self): pass
def __init__(self):
self.width = None
self.height = None
@property
def width_prop(self):
return self.width
@property
def height_prop(self):
return self.height
@width_setter.setter
def width_setter(self, width):
self.width = width
@height_setter.setter
def height_setter(self, height):
self.height = height
class Triangle(Polygon):
def compute_area(self):
return 0.5 * width * height
if __name__ == "__main__":
tri = Triangle()
tri.height_setter(20)
tri.width_setter(30)
print "Area of the triangle = ", tri.compute_area()
我得到的错误信息是NameError: name 'width_setter' is not defined。我的实现可能有什么问题?
编辑:
from abc import ABCMeta, abstractmethod
class Polygon:
__metaclass__ = ABCMeta
@abstractmethod
def compute_area(self): pass
def __init__(self):
self.width = None
self.height = None
@property
def width_prop(self):
return self.width
@width_prop.setter
def width_setter(self, width):
self.width = width
@property
def height_prop(self):
return self.height
@height_prop.setter
def height_setter(self, height):
self.height = height
class Triangle(Polygon):
def compute_area(self):
return 0.5 * self.width * self.height
if __name__ == "__main__":
tri = Triangle()
tri.height_prop = 20
tri.width_prop = 30
print "Area of the triangle = ", tri.compute_area()
【问题讨论】:
-
你的意思一定是
@width_prop.setter和@height_prop.setter。 -
是的,我做到了。但还是在抱怨..
-
您的 setter 函数需要与属性命名相同。另外,请使用更新的代码编辑问题。
-
@Shah:不要让你的 Python 承受所有这些噪音。省略所有的 getter 和 setter,直接访问属性。如果你认为不应该,你需要了解更多关于 Python 的知识。
-
如果您的 getter 和 setter 只是您在此处显示的内容,那么您就是在浪费时间。您可以简单地直接访问属性并获得完全相同的效果。您链接到的问题是关于是否写
get_my_attr与@property def my_attr。如果您需要在其中一个或另一个中有代码,那么当然,使用属性。但是如果你没有代码,只是转发一个私有属性,那么跳过整个事情,只使用这个属性。
标签: python properties abc