Bu soru için başka bir cevaptan alınan iyi bir fikre dayanarak, kendi iç sınıfından bir dış sınıfı kullanmak için bazı Python kodu oluşturdum . Kısa, basit ve anlaşılması kolay olduğunu düşünüyorum.
class higher_level__unknown_irrelevant_name__class:
def __init__(self, ...args...):
...other code...
subclasses = self._subclass_container()
self.some_subclass = subclasses["some_subclass"]
del subclasses
def sub_function(self, ...args...):
...other code...
def _subclass_container(self):
_parent_class = self
class some_subclass:
def __init__(self):
self._parent_class = _parent_class
class subclass_2:
def __init__(self):
self._parent_class = _parent_class
return {"some_subclass": some_subclass, "subclass_2": subclass_2}
Ana kod, "üretime hazır" (yorumsuz, vb.). Açılı parantez içindeki her bir değeri (örneğin <x>
) istenen değerle değiştirmeyi unutmayın.
class <higher_level_class>:
def __init__(self):
subclasses = self._subclass_container()
self.<sub_class> = subclasses[<sub_class, type string>]
del subclasses
def _subclass_container(self):
_parent_class = self
class <sub_class>:
def __init__(self):
self._parent_class = _parent_class
return {<sub_class, type string>: <sub_class>}
Bu yöntemin nasıl çalıştığının açıklaması (temel adımlar):
_subclass_container
Değişkene erişmek için bir sarmalayıcı görevi görecek şekilde adlandırılmış bir işlev oluşturun self
, üst düzey sınıfa bir referans (işlev içinde çalışan koddan).
Adında bir değişken oluşturma _parent_class
değişkeni için bir referans self
alt sınıfları olduğunu, bu fonksiyonun _subclass_container
kullanıcılar erişebilir (kaçınır diğer çakışmaları isim self
alt sınıflara değişkenler).
Alt sınıfı / alt sınıfları bir sözlük / liste olarak döndürün, böylece _subclass_container
işlevi çağıran kod, içindeki alt sınıflara erişebilir.
Daha __init__
yüksek seviye sınıfın içindeki fonksiyonda (veya ihtiyaç duyulan her yerde), fonksiyondan döndürülen alt sınıfları _subclass_container
değişkene alın subclasses
.
subclasses
Değişkende depolanan alt sınıfları daha yüksek seviye sınıfın özniteliklerine atayın .
Senaryoları kolaylaştırmak için birkaç ipucu:
Alt sınıfları daha yüksek seviyeli sınıfa atamak için kodun kopyalanması ve işlevi değiştirilen daha yüksek seviyeli sınıftan türetilen sınıflarda kullanılmasını sağlamak __init__
:
Ana kodda 12. satırdan önce ekleyin:
def _subclass_init(self):
Sonra bu işlev satırlarına 5-6 (ana kodun) ekleyin ve 4-7 satırlarını aşağıdaki kodla değiştirin:
self._subclass_init(self)
Alt sınıfların çok / bilinmeyen miktarları olduğunda daha yüksek seviyeli sınıfa alt sınıf atamayı mümkün kılmak.
6. satırı aşağıdaki kodla değiştirin:
for subclass_name in list(subclasses.keys()):
setattr(self, subclass_name, subclasses[subclass_name])
Bu çözümün nerede yararlı olacağına ve daha üst düzey sınıf adının elde edilmesinin imkansız olması gerektiğine dair örnek senaryo:
"A" ( class a:
) adlı bir sınıf oluşturulur. Erişmesi gereken alt sınıfları vardır (ebeveyn). Bir alt sınıfa "x1" adı verilir. Bu alt sınıfta kod a.run_func()
çalıştırılır.
Daha sonra "a" ( ) sınıfından türetilen "b" adlı başka bir sınıf oluşturulur class b(a):
. Bundan sonra, bazı kodlar çalışır b.x1()
(türetilmiş bir alt sınıf olan b'nin "x1" alt işlevini çağırır). Bu işlev a.run_func()
, "a" sınıfının "run_func" işlevini çağırarak çalışır , üst işlevinin "run_func" işlevini değil , "b" (olması gerektiği gibi) işlevini çağırır, çünkü "a" sınıfında tanımlanan işlev başvurmak üzere ayarlanmıştır. "a" sınıfının işlevi, çünkü bu onun ebeveyniydi.
Bu, sorunlara neden olabilir (örneğin, işlev a.run_func
silinmişse) ve sınıftaki kodu yeniden yazmadan tek çözüm a.x1
, alt x1
sınıfı "a" sınıfından türetilen tüm sınıflar için güncellenmiş kodla yeniden tanımlamak olacaktır ki bu açıkça zor ve değersiz olacaktır. o.