簡體   English   中英

自動將getter和setter應用於新的對象變量

[英]Automatically apply getter and setter to new object variable

好的,可以說我有一個非常簡單的類,即:

class Test(object):
    pass

我想做的是定義一些默認的setter和getter方法,這些方法在創建時會自動應用於新的對象成員。 在下面的示例中,ax應該始終為大寫,即:

a = Test()
a.x = "foo"
print a.x 
>>> FOO

如果我在類中創建x ,則將出現以下行為:

class Test(object):
    def __init__(self):
        self._x = ""

    @property
    def x(self):
        return self._x

    @x.setter(self, string):
        self._x = string.upper()

那么有沒有可能沒有為每個成員定義setter和getter方法的情況呢? 非常感謝。

編輯:用創建時間,我的意思是不是類實例的ax的創建時間。

最簡單的方法可能是覆蓋__setattr__ ,並將任何字符串值更改為大寫:

>>> class Test(object):
    def __setattr__(self, attr, val):
        if isinstance(val, basestring):
            val = val.upper()
        super(Test, self).__setattr__(attr, val)


>>> t = Test()
>>> t.x = 'foo'
>>> t.x
'FOO'

將字典分類為子類;

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:class Struct(dict):
:    """A dict subclass where you can simply use a dot to access attributes."""
:
:    def __getattr__(self, name):
:        return self[name]
:
:    def __setattr__(self, name, value):
:        self[name] = value
:--

In [2]: a = Struct()

In [3]: a.x = "foo"

In [4]: a.x
Out[4]: 'foo'

In [5]: a.length = 14

In [6]: a
Out[6]: {'length': 14, 'x': 'foo'}

這聽起來像是python Descriptor Proctocol的用例。

class WithDescriptors:
    x = UpperCaseDescriptor()
    y = UpperCaseDescriptor()
    z = UpperCaseDescriptor()


class UperCaseDescriptor(object):
    def __init__(self):
        self.val = ''

    def __get__(self, obj, objtype):   
        return self.val.upper()

    def __set__(self, obj, val):
        self.val = val

那只是一個大綱,我沒有測試代碼即可工作!

如果要將此類行為擴展到實例的每個屬性(即使不存在),則應考慮元類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM