Bir dosyaya kaç sınıf koymalıyım? [kapalı]


274

Dosya başına bir ortak sınıfa sahip olabileceğiniz Java modeline alışkınım. Python'un bu kısıtlaması yok ve sınıfları düzenlemek için en iyi uygulamanın ne olduğunu merak ediyorum.


8
Bence bu, diğer dillerin gereksinimleri ve kuralları göz önüne alındığında makul bir sorudur ve cevap "<Python modüllerini ve paketlerini tanımlayın> ve bunun ötesinde bir tercih meselesi (/ görüş)" dir - bu cevabın kendisi bir fikir değildir
david.libremone

Yanıtlar:


333

Python dosyasına "modül" denir ve yazılımınızı "mantıklı" olacak şekilde düzenlemenin bir yoludur. Diğeri ise "paket" adı verilen bir dizindir.

Bir modül, bir veya iki düzine yakından ilişkili sınıfa sahip olabilecek farklı bir şeydir. İşin püf noktası, bir modülün içe aktaracağınız bir şey olması ve bu içe aktarmanın yazılımınızı okuyacak, koruyacak ve genişletecek kişilere mükemmel bir şekilde duyarlı olması gerekir.

Kural şudur: bir modül yeniden kullanım birimidir .

Tek bir sınıfı kolayca yeniden kullanamazsınız. Herhangi bir zorluk çekmeden bir modülü tekrar kullanabilmeniz gerekir. Kütüphanenizdeki her şey (ve indirip eklediğiniz her şey) bir modül veya bir modül paketidir.

Örneğin, elektronik tabloları okuyan, bazı hesaplamalar yapan ve sonuçları bir veritabanına yükleyen bir şey üzerinde çalışıyorsunuz. Ana programınızın neye benzemesini istiyorsunuz?

from ssReader import Reader
from theCalcs import ACalc, AnotherCalc
from theDB import Loader

def main( sourceFileName ):
    rdr= Reader( sourceFileName )
    c1= ACalc( options )
    c2= AnotherCalc( options )
    ldr= Loader( parameters )
    for myObj in rdr.readAll():
        c1.thisOp( myObj )
        c2.thatOp( myObj )
        ldr.laod( myObj )

İçe aktarmayı kodunuzu kavramlar veya parçalar halinde düzenlemenin bir yolu olarak düşünün. Her bir içe aktarmada tam olarak kaç sınıfın olduğu önemli değildir. Önemli olan, importifadelerinizle tasvir ettiğiniz genel kuruluştur .


24
Haha, alıntılardaki "duyguyu" seviyorum.
cdleary

27
@cdleary: Bir kişinin duygusu, başka birinin deliliğidir. Genellikle, hassas modülleri tanımlayabilirsiniz. Bununla birlikte, büyük bir uygulamada, her zaman analizin birden çok boyutu vardır ve bir kişi, başka bir kişinin işlevselliği dilimlemesi ve küp biçmesi üzerine kılları böler.
S.Lott


4
Soruyu gerçekten cevaplamayan cevap, okunabilirlik hakkında, içinde 500'den fazla satır bulunan dosyaları okumak zor.
Vedmant

38

Yapay bir sınır olmadığından, gerçekten anlaşılabilir olana bağlıdır. Mantıksal olarak birlikte gruplandırılmış oldukça kısa, basit sınıflardan bir grup varsa, bir grup 'a atın. Grup olarak anlamlı olmayan büyük, karmaşık sınıflarınız veya sınıflarınız varsa, sınıf başına bir dosya gidin. Ya da arada bir şey seçin. İşler değiştikçe refactor.


23

Java modelini aşağıdaki nedenden dolayı beğeniyorum. Her sınıfı ayrı bir dosyaya yerleştirmek, kaynak koduna göz atarken sınıfların daha kolay görülmesini sağlayarak yeniden kullanımı teşvik eder. Tek bir dosyada gruplandırılmış bir grup sınıfınız varsa, diğer geliştiriciler için sadece projenin dizin yapısına göz atarak yeniden kullanılabilecek sınıflar olduğu açık olmayabilir . Böylece, sınıfınızın yeniden kullanılabileceğini düşünüyorsanız, onu kendi dosyasına koyacağım.


2
Sana tamamiyle katılıyorum. Tek bir dosyada birkaç kamu sınıfına sahip olmak, sezgiseldir ve birisinin yapıyı gizlemek istediği ve yapışkan yapışkanlık hissi olduğu gibi kodu kavramasını zorlaştırır. Özellikle Java'dan Python'a gelirseniz.
WebComer

Özellikle Java'dan Python'a gelirseniz. Python'da bir dosyaya birçok sınıf atıyorlardı)
WebComer

14

Tamamen projenin ne kadar büyük olduğuna, sınıfların ne kadar sürdüğüne, diğer dosyalardan kullanılacakları vb.

Örneğin, veri soyutlama için sık sık bir dizi sınıf kullanıyorum - bu yüzden sadece 1 satır uzunluğunda olabilen 4 veya 5 sınıfım olabilir ( class SomeData: pass).

Bunların her birini ayrı dosyalara bölmek aptalca olurdu - ancak farklı dosyalardan kullanılabildikleri için, bunları ayrı bir data_model.pydosyaya koymak mantıklı olurdu, böylece yapabilirimfrom mypackage.data_model import SomeData, SomeSubData

İçinde çok sayıda kod bulunan bir sınıfınız varsa, belki de yalnızca bazı işlevlerde kullanıldığında, bu sınıfı ve yardımcı işlevleri ayrı bir dosyaya bölmek iyi bir fikir olacaktır.

Onları öyle yapmalısınız from mypackage.database.schema import MyModel, değil from mypackage.email.errors import MyDatabaseModel- bir şeyleri mantıklı bir şekilde içe aktardığınız yerde ve dosyalar on binlerce satır uzunluğunda değilse, doğru bir şekilde düzenlediniz.

Python Modülleri dokümantasyon paketleri organize bazı yararlı bilgiler.


1
Python Modülleri belgelerine bozuk bağlantı. Belki Bölüm 6.4 Modüller.Paketler şimdi amaçlanan bağlantıdır?
cod3monk3y

9

Dosyaların huzursuzluğundan rahatsız olduğumda ve arzu edilen ilişkisel yapı doğal olarak ortaya çıkmaya başladığında kendimi bir şeyleri parçalarken buluyorum. Genellikle bu iki aşama çakışıyor gibi görünmektedir.

İşleri çok erken ayırırsanız çok can sıkıcı olabilir, çünkü tamamen farklı bir yapı düzeninin gerekli olduğunu fark etmeye başlarsınız.

Öte yandan, herhangi bir .java veya .py dosyası 700'den fazla satıra ulaştığında sürekli "o bit" in nerede olduğunu hatırlamaya çalışırken sinirlenmeye başlıyorum.

Python / Jython ile içe aktarma ifadelerinin dairesel bağımlılığı da bir rol oynuyor gibi görünüyor: çok fazla işbirliği yapan temel yapı taşını ayrı dosyalara bölmeye çalışırsanız, dilin bu "kısıtlaması" / "kusurları" sizi bir şeyleri gruplandırmaya zorlar gibi görünüyor, belki daha mantıklı bir şekilde.

Paketlere ayrılma konusunda, gerçekten bilmiyorum, ama muhtemelen aynı canlandırma ve mutlu yapının ortaya çıkması kuralının tüm modülerlik seviyelerinde işe yaradığını söyleyebilirim.


6

Ben çok büyük ve karmaşık yapmadan bu dosyada mantıksal olarak gruplandırılabilir kadar çok sınıf koymak söyleyebilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.