Kitaplığın bir parçası olan bir python sınıfını yeniden adlandırdım. Bir süre önce bir önceki adı kullanma olasılığını bırakmaya istekliyim, ancak kullanıcı tarafından onaylanmadığını ve gelecekte kaldırılacağını bildirmek isterim. Sınıf (isim) kullanımdan kaldırmayla ilgili uyarılma
böyle olsun bir takma ad kullanmak için yeterli olacağını geriye dönük uyumluluk sağlamak için düşünüyorum:class NewClsName:
pass
OldClsName = NewClsName
nasıl zarif bir şekilde kullanımdan kaldırılmış olarak OldClsName
işaretlemek için hiçbir fikrim yok. Belki de NewClsName
nesnesini (*args
ve **kvargs
kullanarak) bir uyarı veren (günlük) ve OldClsName
yapabilen bir işlev yapabilir, ancak yeterince zarif görünmüyor (veya belki de?). Ancak, Python standart kitaplık kullanımdan kaldırma uyarılarının nasıl çalıştığını bilmiyorum. İhmal ile başa çıkmak için güzel bir sihir olabileceğini hayal ediyorum, ör. Bazı tercümanların komut satırı seçeneklerine bağlı olarak hata veya yanlışlık olarak ele alınmasını sağlar.
Sorun şudur: Kullanıcıları, eski bir sınıf takma adı (veya genel olarak eski bir sınıf) kullanma konusunda uyarma.
DÜZENLEME: fonksiyon yaklaşımı benim için çalışmıyor sınıf OldClsName
bir fonksiyonu olarak tanımlanır çağrılacak edilemez bazı sınıf yöntemleri (fabrika yöntemleri) sahip olduğundan (Zaten bir deneyin verdi) . Aşağıdaki kod çalışmaz:
class NewClsName(object):
@classmethod
def CreateVariant1(cls, ...):
pass
@classmethod
def CreateVariant2(cls, ...):
pass
def OldClsName(*args, **kwargs):
warnings.warn("The 'OldClsName' class was renamed [...]",
DeprecationWarning)
return NewClsName(*args, **kwargs)
OldClsName.CreateVariant1(...)
Çünkü:
AttributeError: 'function' object has no attribute 'CreateVariant1'
benim tek seçenek miras mı? Dürüst olmak gerekirse, bana çok temiz görünmüyor - gereksiz hiyerarşinin getirilmesiyle sınıf hiyerarşisini etkiliyor. Ayrıca, çoğu durumda bir sorun değildir, ancak kitaplığı kullanan kötü yazılmış kodun kullanılması durumunda sorun olabilir.
Ayrıca, bir kukla, ilişkisiz bir OldClsName
sınıfı oluşturabilir ve bir kurucu yanı sıra tüm sınıf yöntemleri için sarmalayıcılar uygulayabilirim, ancak bence daha da kötü bir çözümdür.
kolay yanı olmalı miras Destekleyici - sadece bir 'sınıf OldClsName (NewClsName bilgileri): # ve aşırı yük __new__'. Bu çözümün kullanıldığını ve 'uyarı' modülünden bahsetmek için – delnan
+1. Ne yazık ki, işlev çözümü benim için çalışmıyor (bkz. Düzenlenmiş soru). Belki başka bazı temiz çözümler var? : D –
Yeni sınıfa hem çağrıları hem de öznitelik erişimini proxy gönderebilen bir sarmalayıcı nesnesi kullanma örneği ile güncellendi. – AdamKG