2013-10-10 18 views
71

__init__:Örneği özellik_adı dışında tanımlanan öznitelik Böyle, birden işlevleri çağırmak izin vererek benim sınıf yapıcısı bölmek

Instance attribute attribute_name defined outside __init__: my tercüman mutlu benim kod çalışır iken, PyLint şikayeti vardır

class Wizard: 
    def __init__(self, argv): 
     self.parse_arguments(argv) 
     self.wave_wand() # declaration omitted 

    def parse_arguments(self, argv): 
     if self.has_correct_argument_count(argv): 
      self.name = argv[0] 
      self.magic_ability = argv[1] 
     else: 
      raise InvalidArgumentsException() # declaration omitted 

# ... irrelevant functions omitted 

üstünkörü Google arama

şu anda sonuçsuz olduğunu. Tüm kurucu mantığını __init__ içinde tutmak, düzensiz görünüyor ve Pylint uyarısını kapatmak da hack-ish gibi görünüyor.

Bu sorunu gidermek için Pythonic yolu nedir?

+4

Uyarı sadece ne yazdığını söylüyor. Örnek değişkenleri kurucunun dışında fiili olarak başlatırsanız, bunun [POLS] (http://en.wikipedia.org/wiki/Principle_of_least_astonishment) ihlal ettiğini düşünürüm. 'Parse_arguments' satırını satır içi veya değişkenleri başlatmak için __init__' işlevinin dönüş değerlerini kullanın ve pylint mutlu olacak sanırım. – miku

cevap

17

Sadece parse_arguments() bir tuple döndürmek ve gerektiğinde __init__ içindeki niteliklerini içine açmak.

Ayrıca, sana exit(1) kullanarak yerine İstisnalar kullanmanızı öneriyoruz. Sen

class Wizard: 
    def __init__(self, argv): 
     self.name,self.magic_ability = self.parse_arguments(argv) 

    def parse_arguments(self, argv): 
     assert len(argv) == 2 
     return argv[0],argv[1] 
+0

Bu nispeten basit bir program olduğundan ve ana kod tek bir Sihirbaz (ana sınıf) oluşturacak olduğundan, istisnaların aşırı olduğunu düşündüm. –

+1

@StevenLiao hepsi iyi ve iyi, ama yine de daha okunaklı, daha az kod satırı ve geleceğe yönelik iyi alışkanlıklar geliştiriyor. Sana bağlı. – roippi

+0

Tamam, ancak özel durumlarda nesneye parse_arguments çağırarak bu özelliklerin yalnızca eklenmesi gerekiyorsa ne olur? Bu durumda özniteliklerin Yok'a eşit olarak ayarlanması daha iyi bir çözümdür. – Soldalma

71

Bu mesajın arkasındaki fikir okunabilirliği uğruna vb, yeniden kodunuzu olduğunu tracebacks olsun. Bir örneğin sahip olabileceği tüm öznitelikleri __init__ yöntemini okuyarak bulmayı umuyoruz.

Yine de bu diğer yöntemler içine başlatma bölmek isteyebilirsiniz. Böyle bir durumda, None (bir belge ile) özniteliklerini __init__'a atamanız ve ardından alt başlatma yöntemlerini çağırmanız yeterlidir.

İlgili konular