Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 最佳实践:通过get/set抽象数据还是允许访问变量?_Oop - Fatal编程技术网

Oop 最佳实践:通过get/set抽象数据还是允许访问变量?

Oop 最佳实践:通过get/set抽象数据还是允许访问变量?,oop,Oop,前几天我写了一些python类,创建了一个类似这样的类: class Option: Name = "" Description = "" Criteria = {} def __init__(self, name, descr): self.Name = name self.Description = descr def addCriteria(self, cname, ctype): ...

前几天我写了一些python类,创建了一个类似这样的类:

class Option:
    Name = ""
    Description = ""
    Criteria = {}

    def __init__(self, name,  descr):
        self.Name = name
        self.Description = descr

    def addCriteria(self,  cname,  ctype):
        ...
在我的程序中,我直接访问类中的数据,即:

cname = opt.Name
虽然这是一个有意识的决定,但我知道很多类都会将其抽象为:

cname = opt.getName()
我是否应该花时间提取所有数据而不允许直接访问?当您为类数据添加访问方法时,会触发什么


Mike

尽管这与您在OOP中学到的任何东西都背道而驰,但我建议您推迟做出决定,直到事实证明,您需要在Attribute access上使用一些“魔法”。在Python中,使用特殊的
属性
函数重构提供属性的类非常容易:

class ItsMagic(object):

    _name = None

    def _get_name(self):
        return self._name

    def _set_name(self, new_name):
        self._name = new_name

    Name = property(_get_name, _set_name)


magic = ItsMagic()
magic.Name = "Foo"
这对此类的客户机是透明的,也就是说,他们通常不知道(也不应该关心)属性引用是通过提供对实际对象属性的访问来处理的,还是通过magic getter/setter函数来处理的,并且可以在以后应用(如果事实证明需要的话)