__getattr__
Süslü bir şey yapmak için bir sınıfta yöntemi geçersiz kılmak istiyorum ama varsayılan davranışı kırmak istemiyorum.
Bunu yapmanın doğru yolu nedir?
__getattr__
Süslü bir şey yapmak için bir sınıfta yöntemi geçersiz kılmak istiyorum ama varsayılan davranışı kırmak istemiyorum.
Bunu yapmanın doğru yolu nedir?
Yanıtlar:
Geçersiz kılma iyi __getattr__
olmalıdır - __getattr__
yalnızca son çare olarak adlandırılır; örn., Adla eşleşen hiçbir öznitelik yoksa. Örneğin, erişirseniz foo.bar
, __getattr__
yalnızca foo
hiçbir özniteliği yoksa çağrılacaktır bar
. Özellik işlemek istemediğiniz bir özellikse AttributeError
:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
raise AttributeError
Ancak, aksine __getattr__
, __getattribute__
ilk olarak adlandırılacaktır (sadece yeni stil sınıfları için çalışır, yani nesneden miras alanlar). Bu durumda, varsayılan davranışı aşağıdaki gibi koruyabilirsiniz:
class Foo(object):
def __getattribute__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
return object.__getattribute__(self, name)
Daha fazla bilgi için Python belgelerine bakın .
__getattr__
- ne yapacağına dair bir fikir var mı? ( AttributeError: 'super' object has no attribute '__getattr__'
)
AttributeError
istisna argümanlarında özniteliğin bağlamı olmayan bir var .
class A(object):
def __init__(self):
self.a = 42
def __getattr__(self, attr):
if attr in ["b", "c"]:
return 42
raise AttributeError("%r object has no attribute %r" %
(self.__class__.__name__, attr))
>>> a = A()
>>> a.a
42
>>> a.b
42
>>> a.missing
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: 'A' object has no attribute 'missing'
>>> hasattr(a, "b")
True
>>> hasattr(a, "missing")
False
self.__class__.__name__
bunun yerine kullanılması gerektiğini düşünüyorumself.__class__
__repr__
Michael yanıtını genişletmek için, kullanarak varsayılan davranışı korumak istiyorsanız __getattr__
, bunu şu şekilde yapabilirsiniz:
class Foo(object):
def __getattr__(self, name):
if name == 'something':
return 42
# Default behaviour
return self.__getattribute__(name)
Şimdi istisna mesajı daha açıklayıcı:
>>> foo.something
42
>>> foo.error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getattr__
AttributeError: 'Foo' object has no attribute 'error'
__getattr__
ve __getattribute__
?