Pythonic'in aynı dosyada tanımlanmış birden fazla sınıfa sahip olduğu düşünülüyor mu?


31

Python ile ilk kez çalışırken, aynı dosyada, sınıf başına bir dosya kullanan Java gibi diğer dillerin aksine, birden fazla sınıf yazdığımı anladım.

Genellikle, bu sınıflar, kullanımı biraz değişiklik gösteren 1-2 somut uygulama ile, 1 soyut temel sınıftan oluşur. Aşağıda böyle bir dosya gönderdim:

class Logger(object):

    def __init__(self, path, fileName):
        self.logFile = open(path + '/' + filename, 'w+')
        self.logFile.seek(0, 2)

    def log(self, stringtoLog):
        self.logFile.write(stringToLog)

    def __del__(self):
        self.logFile.close()

class TestLogger(Logger):   

    def __init__(self, serialNumber):
        Logger.__init__('/tests/ModuleName', serialNumber):

    def readStatusLine(self):
        self.logFile.seek(0,0)
        statusLine = self.logFile.readLine()
        self.logFile.seek(0,2)
        return StatusLine

    def modifyStatusLine(self, newStatusLine):
        self.logFile.seek(0,0)
        self.logFile.write(newStatusLine)
        self.logFile.seek(0,2)

class GenericLogger(Logger):

    def __init__(self, fileName):
        Logger.__init__('/tests/GPIO', fileName):

    def logGPIOError(self, errorCode):
        self.logFile.write(str(errorCode))

Yukarıda görüldüğü gibi, aşağıda birkaç uygulama farklılığı olan bir Logger temel sınıfım var.

Soru: Bu standart python için mi yoksa herhangi bir dil için mi? Varsa bu uygulamayı kullanmaktan ne gibi sorunlar çıkabilir?

DÜZENLEME: Gerçekten bu konuda rehberlik aramıyorum belirli ama daha genel anlamda, dosyanın. Sınıflar 3-5 orta derecede karmaşık yöntemlerle sonuçlandıysa ne olur? Onları bölmek mantıklı olur mu? Bir dosyayı bölmeniz gerektiğini söyleyen kesim nerede?


3
Dosya başına bir sınıfa sınırlama C ++ ile ilgili değildir. Java, kaçınılması gereken bir yer olduğunu düşündüğüm tek dil. C ++ 'da, tek bir .h / .cpp dosyasının bir birincil sınıfa ve birincil sınıfa özel olan veya olmayan birçok yardımcı sınıfa sahip olması oldukça yaygındır.
Robotu

@StevenBurnap Doğru olduğun gibi c ++ 'ı kaldırdım.
Ampt

1
Ayrıca otomatik yükleme kolaylaştırmak için php yapılır. Öte yandan, php'de açıkça ad alanı bildirimi yapabilirsiniz.
bodo

Yanıtlar:


24

Bu iyi. C ++ 'da referans olarak iyi.

Sıkı birbirine bağlı şeyleri bir arada tutmak mantıklı bir uygulamadır. Uygunsuz eşleştirmeden kaçınmak da iyi bir uygulamadır. Doğru dengeye grev koymak, katı kurallar meselesi değil, farklı kaygılar arasında denge kurar.

Bazı kurallar:

  1. Boyut

    Aşırı büyük dosyalar çirkin olabilir, ama bu durum böyle değil. Çirkinlik muhtemelen bir dosyayı bölmek için yeterince iyi bir nedendir, ancak bu estetik anlayışı geliştirmek büyük ölçüde bir deneyim meselesidir, bu yüzden bir priori yapmanın yolunu bulmanıza yardımcı olmaz

  2. Endişelerin Ayrılması

    Somut uygulamalarınızın çok farklı iç endişeleri varsa, tek dosyanız bu endişeleri toplar. Örneğin, üst üste binmeyen bağımlılıkları olan uygulamalar tek dosyanızı tüm bu bağımlılıkların birliğine bağlı hale getirir.

    Bu nedenle, bazen alt sınıfların bağımlılıklarına bağlanmalarının, arayüze bağlanmalarından daha ağır basan olduğunu düşünmek makul olabilir (veya bunun tersine, bir arayüz uygulama kaygısı, bu uygulamanın içindeki endişelerden daha zayıf).

    Özel bir örnek olarak, genel bir veritabanı arayüzü alın. Bellek içi bir DB, bir SQL RDBMS ve bir web sorgusu kullanan somut uygulamalar, arabirimden başka hiçbir ortak noktaya sahip olmayabilir ve hafızada hafif bir versiyonun bir SQL kütüphanesini de ithal etmesini isteyen herkesi zorlar.

  3. kapsülleme

    Eğer rağmen yapabilirsiniz aynı modülde iyi kapsüllü sınıfları yazmak, bu olabilir başka türlü modülün dışına ihraç olmaz uygulama ayrıntılarını erişebilir sırf gereksiz bağlantısını teşvik ediyoruz.

    Bu sadece zayıf bir tarz olduğunu düşünüyorum, ancak gerçekten alışkanlığı kıramazsanız modülü bölerek daha iyi bir disiplini zorlayabilirsiniz.


2
Bir dosyada sınıfları birleştirmenin normalliğini gösteren dış referansları veya neden tamam olduğunu gösteren daha fazla açıklama yaparak cevabınız daha güçlü olacaktır.

1
Bunun sadece demek istediğimin bir örneği olduğunu ve sorunun niteliğini tam olarak temsil etmediğini belirtmek için soruyu düzenledim. Neden onları aynı dosyada tutmak, ihtiyaç duyulan yere aktarmaktan daha iyidir?
Ampt

Çok sayıda minik dosyaya sahip olmak, birkaç dev dosyaya sahip olmak kadar yönetmek zor olabilir. Python oldukça özlü bir dildir. Örneğin bunu gösteriyor. Bu üç sınıf doğrudan ilişkilidir ve muhtemelen kaydırma yapmadan tek bir düzenleyici penceresine sığar.
Robotu

1
@ GlenH7 - Referanslardan emin değilim, çünkü doğrudan benden doğrudan talepte bulunmamdan, seçim yanlılığımın geçerli olduğunu iddia etmemden kayıyorlar. Bunun yerine açıklamaya odaklanmaya çalıştım.
İşe yaramaz

7

Her zamanki referans belgelerim pythonic nedir bilmek için.

Basit, karmaşıktan daha iyidir.

Düz iç içe daha iyidir.

Gönderen Python Of Zen

Neredeyse istisnasız sınıf adları, CapWords kurallarını kullanır.

Paket ve Modül Adları Modüllerin tamamı küçük harfli olmalı. [...] Modül adları, dosya adlarıyla eşleştirilir

Gönderen PEP 8

Benim yorumum, işleri basit ve düz tutacağı kadar iyi olduğudur. Ayrıca, sınıf isimleri ve dosya isimlerinin farklı durumları olduğundan, yine de aynı olmaları gerektiği için, bir dosyada birden fazla ilgili sınıfı paketlemede herhangi bir sorun görmemeliydim.


7
Bunu, soru ile ilgili parçalara indirgeyebilir misiniz? Her ikisini de birden çok kez okudum ama özellikle hangi parçaların şu anki sorumla ilgili olduğunu bulmakta zorlanıyorum .
Ampt

1
Gerçekten, cevabımı düzenledim.
SylvainD

1

Şu an sahip olduğun şey iyi. Standart kütüphaneye gidin ve göz atın - tek bir dosyada birden fazla ilişkili sınıf bulunan birçok modül var. Bir noktada işler büyür ve sonunda birden fazla dosya içeren modülleri kullanmaya başlamak isteyeceksiniz, ancak ne zaman olacağı konusunda gerçek bir kural yok. Sadece bir dosya 'çok büyük' ​​hissetmeye başladığında işler bölünür.


0

Kesinlikle sorun yok ve sizi okudukları sürece tek bir dosyada birkaç ders almanızı tavsiye ederim. Genel olarak sınıflarınız kısa ve öz kalmalı ve davranışları büyük monolitik olanları oluşturmaktan ziyade iki veya daha fazla sınıfa bölmelisiniz. Birkaç küçük sınıf yazarken, aynı dosyada olanları tutmak gerçekten gerekli ve faydalıdır.


-1

Kısacası - cehennem evet.

Ayrıca, tek bir dosyada birden fazla sınıf olması bazen çok kullanışlıdır. Bazı paketler ( six, bottle), pip kurulmadan herhangi bir üçüncü taraf modüle kolayca entegre edilebilmesi için açıkça tek bir dosyada gönderilir (bazen arzu edilir). Ancak, kodunuzu iyi organize ettiğinizden emin olun. Kod yorumlarını ve ayırma bloklarını daha okunaklı hale getirmek için yoğun olarak kullanın.


3
Bu birkaç yıl önce yayınlanan önceki cevap üzerine önemli bir şey eklemek gibi görünmüyor
gnat
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.