正确的阶级和财产结构

时间:2018-07-11 12:46:37

标签: python python-3.x properties

我了解属性和类在Python中的工作方式,其中最清晰的示例是使用属性,我可以想到的是将温度设置为不使其低于绝对零值。我现在想知道,如果该方法实际上将要进行某种转换,则使用属性是个好主意。

抓取Wikipedia的以下属性示例:

23m

让我们说,颜色对于Pen类来说很重要,并且在那里有意义,但是实际的值设置器看起来更像这样:

<script>
function loadXMLDoc() {
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      myFunction(this);
    }
  };
  xmlhttp.open("GET", "HWR.xml", true);
  xmlhttp.send();
}
function myFunction(xml) {
  var i;
  var xmlDoc = xml.responseXML;
  var table="<tr><th>Artist</th><th>Title</th></tr>";
  var x = xmlDoc.getElementsByTagName("my:myFields");
  for (i = 0; i <x.length; i++) { 
    table += "<tr><td>" +
    x[i].getElementsByTagName("my:EmpName")[0].childNodes[0].nodeValue +
    "</td><td>" +
    x[i].getElementsByTagName("my:EmpTitle")[0].childNodes[0].nodeValue +
    "</td></tr>";
  }
  document.getElementById("demo").innerHTML = table;
}
</script>

我喜欢从对象的角度来看,您只是拥有颜色,但是除非有人深入研究,否则实现对于某人来说有点令人困惑。这是使用属性的好方法还是应该更像是这样:

class Pen(object):
    def __init__(self):
        self._color = 0 # "private" variable

    @property
    def color(self):
        return self._color

    @color.setter
    def color(self, color):
        self._color = color

更清楚地知道颜色的实际派生方式。

1 个答案:

答案 0 :(得分:1)

整个想法恰恰相反:您不要使用类的用户知道如何实现颜色。这就是类和封装的全部要点。

用户只需进行分配

 my_object.color = 'some_hex_value'

让我们的类来处理它。

属性的想法是,您应该将对象成员变量用作公共变量,然后仅在发生某些更改时才定义getter和setter。与例如。 Java,您可以定义在大多数情况下不执行任何操作的getter和setter,以防万一发生某些更改。

如果颜色对您的班级来说很重要,也许您应该创建一个Color类,而Pen类应该仅接受该实例。但是,除非您提供进一步的信息,否则就无法判断。