Ben aslında bir iletişim protokolünün bir kısmı için Çeteleler temsil Python otomatik oluşturulan sınıfların büyük miktarda var, onlar bu şekilde de otomatik jeneratör ve kolaylaştırır böyleceSınıf değişkenlerini python alt sınıfına dinamik olarak ekleyebilir misiniz?
# definitions.py
class StatusCodes(ParamEnum):
Success = 1
Error = 2
UnexpectedAlpaca = 3
class AlpacaType(ParamEnum):
Fuzzy = 0
ReallyMean = 1
# etc etc etc
şeyler tanımlanması gibi bakmak insanlar için değişiklik yapmak. ParamEnum sınıfı gelen ağ verilerinden tüm işlevselliği almak/ayarı, karşılaştırma, dönüşüm ve oluşturulmasını sağlar ve
Ancak bu sınıflar bazı ekstra meta verileri gerektirir vb. Ben onu daha az okunabilir yapar gibi olsa her sınıfın kaynak tanımına bu eklemek istemiyorum ve ben ancak bu
# param_enum.py
class ParamEnum(object):
def __init__(self):
self.__class__._metadata = get_class_metadata(self.__class__)
gibi yapıyorum anda autogenerator
kıracak Bu, her zaman, bu Enumlardan birini (her zaman gerçekleşir), yalnızca tanımda değil (metadata değişmez, bu yüzden sadece bir kez ayarlanması gerekir) her an gerçekleşeceğinden vurur.
I bunu tanım dosyasının sonuna ekledi, ancak sorunla karşılaştı Orada da.
class StatusCodes(ParamEnum):
Success = 1
Error = 2
UnexpectedAlpaca = 3
for var in locals(): # or globals?
add_metadata(var)
#doesn't work because it is in the same file, modifying dict while iteratng
alt sınıflarına miras edilebilir/geçersiz kılma sınıf tanımlandığında işlevsellik ekleme Python yolu var mı? Bir sınıf veya işlev değişikliği sahip olduğu sonrası: İdeal bir sınıf dekoratör
def add_metadata(cls):
cls._metadata = get_class_metadata(cls)
return cls
@add_metadata
class StatusCodes(ParamEnum):
Success = 1
Error = 2
UnexpectedAlpaca = 3
dekoratörler için çok motivasyon aslında Ne yapmak isterseniz bunu kullanın
class ParamEnum(object):
def __when_class_defined__(cls):
add_metadata(cls)
Python'da, Sınıflar Meta sınıflarının örnekleridir. Yani, ParamEnum'unuzu '__new__' geçersiz kılan bir Meta Sınıfı vererek bunu başarabilirsiniz. – Phillip