2011-08-04 10 views
6

Bu, muhtemelen daha önce sorulmuştur, ancak benim cevabımla ilgili cevabı bulamadım (genel olarak ...)Bir Python sınıf tanımını, bu sınıfın yardımcı dosyalarına göre düzgün bir şekilde nasıl düzenleriz?

İşte soruma bir örnek. Paketime 'okul' denir ve benim de yöntemlerin etini içeren .py dosyalarına sahip olan 'book' adında bir sınıfım var. İçe aktarma ifadelerinin garip görünmemesi için hepsini nasıl organize edeceğimi bilmiyorum.

Dosyaları nasıl düzenlerim?

from school import Book 
b = Book(name="The Bible") 
b.read() 

Ama yukarıdaki dosya yapısından

, yapacak olurdu: bunun üzerinde mantıklı çünkü

/school/ 
     pencil/ 
     book/ 
      __init__.py 
      read.py 
      burn.py 
      book.py 

ben böyle bir şey yapmak mümkün istiyorum

from school.book import Book 
b = Book(....etc 

VEYA

from school import book 
b = book.Book(...etc 

T hese garip/tekrarlayan ... burada neyi özlüyorum?

cevap

7

Paketleri, sanırım sınıflarla karıştırıyorsunuz. Şahsen, her sınıf tanımını ve aynı sınıfla doğrudan ilişkili olan tüm işlevleri aynı .py dosyasına koyardım. Örneğin, okuma bir nesne değildir, bu yüzden kitap sınıfının altında bir işlev olarak koyardım, kendi .py dosyası değil. Yani, yapı böyle bir şey olurdu. book.py İçinde

/school/ 
    pencil.py 
    book.py 

, bu

class Book(): 
    def __init__(self,name,author,isbn,your_variable_here): 
     #Your init method 

    def read(self,kid): 
     return "{0} is reading {1}.".format(kid,self.name) 

    def burn(self,library,lighter): 
     library.remove(self) 
     lighter.light(self) 
     return "Preparing to burn people." 

gibi bir şey Sonra olurdu, senin ithalatı buna benziyor.

from school import book 
    b = book.Book("The Art of War","Sun Tzu",'999342052X','Books rock!') 
    b.read(ike) #This assumes ike is an object, probably of the class Student, defined and imported from elsewhere 
    b.burn(library,lighter) #Once more, I'm assuming these are objects for which you've imported the definition and defined them earlier. 

Bu sistemin bu avantajı, gerçeklik modellerini daha yakından incelemesidir. Bir dosya yapısının (sizin de belirttiğiniz gibi, kıvrık hale gelebilir) bir grup işlevden ziyade, sınıflara göre gruplara göre mantıksal gruplara ve yapılara sahip olursunuz. Bununla birlikte, Öğrenci'nin okuma fonksiyonuna sahip olması gerektiğini ve kütüphanenin ödeme fonksiyonuna sahip olması gerektiğini ve kitapların sadece yanma işlevine sahip olduğunu iddia ediyorum. Ama kitapların okunmaması, insanların yapması. Ve kitaplar kontrol etmiyor, kütüphaneler yapıyor. Bunu nasıl düzenlemek istediğin sorusu.

+0

Yanıt için teşekkürler. Fakat read() ve burn() yöntemlerinin herbiri yüzlerce satırsa ve book.py'nin bir kod karmaşası olmasını istemiyorsam ne olur? – Ian

+1

Her yöntem yüzlerce satırdır? Dürüst olmak gerekirse, bu şekilde bir dizi daha kısa işlevler olduğunu tekrar gözden geçirmenin yollarını bulmaya çalışacağım. Bu her zaman mümkün değil, ama yine de denerim. İdeal olarak, her bir işlevin bir şey yapmasını istersiniz, ve sadece bir şey, ve tek bir 'sayfaya' sığdırmak istersiniz (basılı bir sayfa veya kaydırma yapmadan editörünüzün tek bir ekranı olsun). Bununla birlikte, birkaç yüz satır uzunluğunda bazı işlevlerim olsa bile, hepsini aynı sınıfta tutardım. Python'un nesne modeline daha iyi uyuyor ve her şeyi bulmak daha kolay. – Jonathanb

+1

O zaman muhtemelen daha küçük parçalara ayrılabilirler ve sizi küçük, kendi kendine yeten küçük özel yöntemler ve küçük yöntemlerin çalışmasını organize eden küçük kamu giriş yöntemleri read() ve burn() ile bırakabilirsiniz. Fakat her halükarda, büyük bir karmaşık yöntemin, ana dosyada olduğundan daha farklı bir dosyada (sınıfta atıfta bulunulan her şeyden daha uzak) anlaşılması daha kolay olmadığını görmüyorum. – Ben

İlgili konular