簡體   English   中英

Python-如何創建在__init__期間可配置的不可變類成員

[英]Python - how to create immutable class member that is configurable during __init__

我想創建一個類成員,該成員可以由構造函數分配一個用戶指定的值,但此后不能更改。 有沒有辦法做到這一點?

到目前為止,我已經獲得了以下代碼,該代碼通常有效,但不是“白痴證明”。

def constantify(f):
    def fset(self, value):
        raise SyntaxError ('Not allowed to change value')
    def fget(self):
        return f(self)
    return property(fget, fset)

class dummy(object):
    def __init__(self,constval):
        self.iamvar = None
        self._CONST = constval

    @constantify
    def SOMECONST(self):
        return self._CONST


dum = dummy(42)
print 'Original Val:', dum.SOMECONST

這打印“原始Val:42”

dum.SOMECONST = 24 

這給出了正確的SyntaxError

但是,輸入一個白痴,

dum._CONST = 0
print 'Current Val:', dum.SOMECONST

給出“當前值:0”

有沒有更好的防白痴方法來實現這一目標?

還是可初始化但之后仍保持const的類成員某種程度上不是“ pythonic”方式? (我仍然是學習pythonic方式的新手)在那種情況下,創建僅實例化時每個實例都是“可配置”的類的pythonic方式是什么?

卡爾皮特

更新 :我不想創建一個所有成員都是不可變的類。 我只希望某些成員保持不變,而其他成員則隨時可變。

我能想到的最簡單的方法是,重寫__setattr__並在設置了特定屬性時引發一個錯誤,就像這樣

class dummy(object):
    def __init__(self, arg):
        super(dummy, self).__setattr__("data", arg)

    def __setattr__(self, name, value):
        if name == "data":
            raise AttributeError("Can't modify data")
        else:
            super(dummy, self).__setattr__(name, value)

a = dummy(5)
print a.data
# 5
a.data = "1"
# AttributeError: Can't modify data

關於collections.namedtuple一件好事是,您可以從其實例派生另一個類:

from collections import namedtuple

class Foo(namedtuple('Foo', ['a', 'b'])):
    def __new__(cls, a, b, *args, **kwargs):
        return super(Foo, cls).__new__(cls, a, b)

    def __init__(self, a, b, c):
        # a & b are immutable and handled by __new__
        self.c = c

暫無
暫無

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

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