我需要創建一個對象,以任何方式引發自定義異常UnusableObjectError
(創建它時不應創建異常)。以任何方式引發異常的對象
a = UnusableClass() # No error
b = UnusableClass() # No error
a == 4 # Raises UnusableObjectError
'x' in a # Raises UnusableObjectError
for i in a: # Raises UnusableObjectError
print(i)
# ..and so on
我想出了下面這似乎像預期的代碼。
class UnusableObjectError(Exception):
pass
CLASSES_WITH_MAGIC_METHODS = (str(), object, float(), dict())
# Combines all magic methods I can think of.
MAGIC_METHODS_TO_CHANGE = set()
for i in CLASSES_WITH_MAGIC_METHODS:
MAGIC_METHODS_TO_CHANGE |= set(dir(i))
MAGIC_METHODS_TO_CHANGE.add('__call__')
# __init__ and __new__ must not raise an UnusableObjectError
# otherwise it would raise error even on creation of objects.
MAGIC_METHODS_TO_CHANGE -= {'__class__', '__init__', '__new__'}
def error_func(*args, **kwargs):
"""(nearly) all magic methods will be set to this function."""
raise UnusableObjectError
class UnusableClass(object):
pass
for i in MAGIC_METHODS_TO_CHANGE:
setattr(UnusableClass, i, error_func)
(一些改進而成,由Duncan的意見建議)
問題:
有描述,其行爲已經存在的類?
如果不是,我的UnusableClass()
中是否有任何缺陷(例如,在使用類的實例時不會產生錯誤),如果是這樣,我該如何解決這些缺陷?
設置'__'如你期望在一個實例方法一般不會工作。你應該直接在課堂上定義它們。重新定義'__getattribute__'阻止訪問任何其他比你要允許很可能會做你嘗試什麼簡單的方法的那些屬性。 – Duncan
一個例子,你希望這是行不通的,嘗試調用一個實例:一'()''給類型錯誤:「UnusableClass」對象不callable'因爲實例設置'__call__'被忽略。同樣'a [1] = 0'。當然,因爲這些沒有實現,他們仍然會拋出一個錯誤,而不是你的自定義錯誤。 在類上定義可以使用'def'或者只在類上使用'setattr'而不是在實例上。 – Duncan
這也似乎是一個完美的用例爲元類... – thebjorn