Python sınıfımın __getattribute__
ve __setattr__
yöntemlerini geçersiz kılmak istiyorum. Kullanım durumum normal olanıdır: Kullanmak istediğim birkaç özel ada sahip olduğum ve başka bir şey için varsayılan davranışı istiyorum. __getattribute__
için, varsayılan davranışı yalnızca AttributeError
'u yükselterek isteyebileceğim gibi görünüyor. Ancak, __setattr__
'da nasıl aynı şeyi yapabilirim? Burada, "A", "B" ve "C" değişken alanları olan bir sınıfı uygulayan önemsiz bir örnek var.Python'daki yeni stil sınıflarında __setattr__ ve __getattribute__ öğelerini düzgün bir şekilde nasıl geçersiz kılarsınız?
class ABCImmutable(SomeSuperclass):
def __getattribute__(self, name):
if name in ("A", "B", "C"):
return "Immutable value of %s" % name
else:
# This should trigger the default behavior for any other
# attribute name.
raise AttributeError()
def __setattr__(self, name, value):
if name in ("A", "B", "C"):
raise AttributeError("%s is an immutable attribute.")
else:
# How do I request the default behavior?
???
Soru işaretlerinin yerine ne geçer? Eski stil sınıfları ile yanıt görünüşte self.__dict__[name] = value
idi, ancak belgeler bunun yeni stil sınıfları için yanlış olduğunu gösteriyor.
"belgeler, yeni stil sınıfları için bunun yanlış olduğunu gösterir" ... ve yeni stil sınıfları için neyin doğru olduğunu göstermedi mi? – Gerrat
Niçin adlandırılmış alanlarınızı sadece set-only özellikler olarak kullanmıyorsunuz? – katrielalex
Değişkenlik, __setattr__ için önemsiz bir örnek kullanım örneğiydi. Benim gerçek kullanımım biraz daha karmaşık. Sınıfım dict'ten miras alır, ancak buna ek olarak, belirli özel anahtarların (çalışma zamanında belirlenir), object ['key'] 'yerine' object.key 'erişilebilir. Muhtemelen çalışma zamanı yansıması veya bir şey kullanarak özellikleri olarak ekleyebilirsiniz ama '__getattr__' ve' __setattr__' kullanmak daha kolaydır ve performans özellikle kritik değildir. –