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_containerDeğ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_classdeğişkeni için bir referans selfalt sınıfları olduğunu, bu fonksiyonun _subclass_containerkullanıcılar erişebilir (kaçınır diğer çakışmaları isim selfalt 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_containeriş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_containerdeğişkene alın subclasses.
subclassesDeğ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_funcsilinmişse) ve sınıftaki kodu yeniden yazmadan tek çözüm a.x1, alt x1sı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.