2017-08-13 87 views
8

Python'da yeniyim ve yöntemleri "alt alanlara" birleştirmenin herhangi bir yolu olup olmadığını merak ediyorum.Python3'teki sınıf içi ad alanları

smth = Something() 
smth.subspace.do_smth() 
smth.another_subspace.do_smth_else() 

Ben bir API sarıcı yazıyorum ve çok benzer yöntemlerle bir sürü (sadece farklı URI) zorunda kalacağım yüzden koyun iyi olurdu gerçi: Bu sözdizimine benzer bir anlamda API istek kategorilerine başvuran birkaç alt uzay. Başka bir deyişle, bir sınıf içinde isim alanları oluşturmak istiyorum. Python'da bunun mümkün olup olmadığını bilmiyorum ve Google'da neleri arayacağımı bilmeliyim.

Herhangi bir yardım için minnettar olacağım. Bunu yapmak için

+1

Bunlar gerçekten yöntemlere mi ihtiyaç duyuyor? Herhangi bir devlete erişime ihtiyaçları var mı? Yuvalanmış modüllere sahip olabilir misiniz? –

+2

'do_smth' gibi yöntemlerin, normal yöntemlerde olduğu gibi, örneğe erişmesi gerekir mi? – BrenBarn

+0

Giriş bilgilerini örnek nitelikleri olarak kaydediyorum. Her yöntemden onlara erişmem lazım. Belki onları saklamanın daha iyi bir yolu vardır. – mDevv

cevap

2

bir yolu sırasıyla do_smth ve do_smth_else sağlayan nesneleri döndüren özellikleri olarak subspace ve another_subspace tanımlayarak geçerli: istediğini yapar

class Something: 
    @property 
    def subspace(self): 
     class SubSpaceClass: 
      def do_smth(other_self): 
       print('do_smth') 
     return SubSpaceClass() 

    @property 
    def another_subspace(self): 
     class AnotherSubSpaceClass: 
      def do_smth_else(other_self): 
       print('do_smth_else') 
     return AnotherSubSpaceClass() 

:

>>> smth = Something() 
>>> smth.subspace.do_smth() 
do_smth 
>>> smth.another_subspace.do_smth_else() 
do_smth_else 

bağlı neyi Bu yöntemleri kullanmak niyetindeyseniz, SubSpaceClass tek bir satır yapmak isteyebilirsiniz, ancak performans kazancına değer olduğundan şüpheliyim.

+1

Bu çok şık bir çözüm. – mDevv

+1

Bu çalışır, ancak her sm..subspace veya smth.another_subspace öğesine eriştiğinizde, yeni bir iç sınıf nesnesi oluşturulur. Bunu, "other_self" yöntemini yazdırarak görebilirsiniz. Örnek yöntemlerin normalde her aramaya yeniden bağlandığı gerçeğinden daha kötü değil, ama eğer bu iç sınıflar çok sayıda yöntem içeriyorsa, her zaman onları yeniden inşa etmek zorunda olan şeyleri yavaşlatırlar –

+2

@mDevv: Katılmıyorum. Gibi PM dikkat çekiyor, bu her seferinde yeni bir sınıf nesnesi oluşturur. En azından bu sınıfları yöntemden uzaklaştırın. Ardından, durumu paylaşma konusunda da endişelenmelisiniz. API'nizi ad alanlarına ihtiyaç duymayacak şekilde yeniden düzenlemeyi mi tercih ederim? –