2015-12-06 18 views
5

Maalesef, Python'da bir sınıf özniteliği sınıf adına başvuramıyor. Bir sınıf niteliği onun sınıf adı başvurmalıdır bir durumdaSınıf özelliğinde sınıf adına başvuruda bulunmanın en iyi yolu nedir?

class Foo(object): 
    bar = Foo 

(benim durumumda, bir kütüphane için bir doğrulama şeması onun parçası), yapılacak en açık yolu nedir: Aşağıdaki bir NameError yükseltir yani?

class Foo(object): 
    bar = None 
Foo.bar = Foo 

Bu çalışır, ancak ilan ettiğinde bir sınıf niteliği başlatılmasını bekliyoruz beri hatta yorumlarla, karışıklığa neden olabilecek, sınıf ilan edilir sonra değil:

aşağıdaki benim şimdiki girişimdir.

Herkes daha iyi bir çözüm var mı?

cevap

2

Sen tutucu dizeleri yerini bir sınıf dekoratör tanımlayabiliriz: o zaman

@moi('bar') 
class Foo(object): 
    pass 

:

+0

, sen ' ''' gibi bazı sabit olduğu yer tutucu hardcode olabilir. – martineau

1

Sen use metaclasses can. Ayar öznitelikleri üzerinde yineleyen ve ardından arka göstergeyi sınıfa kendisi ayarlayan bir __new__ tanımlayın. Sadece 'için' takma '' __class__ istiyorsanız

+0

bu yapılabilir nasıl açar mısınız? Anladığım kadarıyla, tüm sınıf öznitelikleri ayrıştırılıncaya kadar Python sınıf nesnesini oluşturmaz. Bu yüzden neden bu sorun var. Sınıf tanımı kapatıldıktan sonra – PaintingInAir

+0

'__new__' yürütüldü. Sonra, tüm tanımlanmış öznitelikler üzerinde yineleyin ve bunları, sınıfın kendisine bir işaretçi belirleyen bir kodla "düzeltin". Aşağıdaki –

+0

Sınıf dekoratör çözümü daha iyidir. Bunu öneririm. –

0

Neden bir özelliğini kullanın? Eğer bazı miras ile oynarsa sorunları yaratmak için kaçınılmazdır söyledi

@property 
def bar(self): 
    return self.__class__ 

. sınıf sınırlandırılmış olmaktadır

>>> print Foo.bar 
Foo 
+0

Bu, sınıfı bir sınıf özniteliğinde kullanmanıza izin vermiyor gibi görünüyor, çünkü sınıfın arama çubuğuna bir örneğine ihtiyacınız olacaktır. – PaintingInAir

+0

Fakat hangi senaryoda, sınıfın kendisine atıfta bulunan bir sınıf özniteliğine ihtiyacınız olacak? Mülkün başvurduğu herhangi bir şey sadece sınıf nesnesinin kendisine atıfta bulunabilir mi? –

+0

emin değil ama her iki dekoratör kullanabilirsiniz: '@ property' ve' @ classmethod'? (eğer işe yaradıysa oldukça kafa karıştırıcı olurdu ama neden olmasın;)) – bperson

1

Bir sınıf dekoratör

def moi(fieldname): 
    def _selfref(cls): 
     setattr(cls, fieldname, cls.__name__) 
     return cls 

    return _selfref 

kullanım kullanabilirsiniz :

def fixup(cls): 
    placeholder = '@' + cls.__name__ 
    for k,v in vars(cls).items(): 
     if v == placeholder: 
      setattr(cls, k, cls) 
    return cls 

@fixup 
class Foo(object): 
    bar = '@Foo' 

print('Foo.bar: {!r}'.format(Foo.bar)) # -> Foo.bar: <class '__main__.Foo'> 
1

otomatik olarak ayarlamak için bir meta sınıfını kullanın.

def my_meta(name, bases, attrs): 
    cls = type(name, bases, attrs) 
    cls.bar = cls 
    return cls 


class Foo(object): 
    __metaclass__ = my_meta 


>>> print Foo.bar 
<class '__main__.Foo'> 
İlgili konular