Có được coi là Pythonic có nhiều lớp được định nghĩa trong cùng một tệp không?


31

Khi làm việc với python lần đầu tiên, tôi đã thấy rằng cuối cùng tôi đã viết nhiều lớp trong cùng một tệp, trái ngược với các ngôn ngữ khác như Java, sử dụng một tệp cho mỗi lớp.

Thông thường, các lớp này được tạo thành từ 1 lớp cơ sở trừu tượng, với 1-2 triển khai cụ thể mà việc sử dụng của chúng thay đổi đôi chút. Tôi đã đăng một tập tin như vậy dưới đây:

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))

Như đã thấy ở trên, tôi có một lớp cơ sở Logger, với một vài khác biệt thực hiện bên dưới.

Câu hỏi: Đây là tiêu chuẩn cho python, hay cho bất kỳ ngôn ngữ nào? Những vấn đề có thể phát sinh từ việc sử dụng thực hiện này nếu có?

EDIT: Tôi không thực sự tìm kiếm hướng dẫn về tập tin cụ thể này , nhưng theo nghĩa chung hơn. Điều gì xảy ra nếu các lớp học kết thúc là 3-5 phương thức phức tạp vừa phải? Nó sẽ có ý nghĩa để phân chia chúng sau đó? Điểm cắt ở đâu để nói rằng bạn nên chia một tập tin?


3
Giới hạn một lớp cho mỗi tệp KHÔNG phải là một điều C ++. Java là ngôn ngữ duy nhất tôi biết về nơi mà nó được coi là thứ cần tránh. Trong C ++, một tệp .h / .cpp duy nhất có một lớp chính và rất nhiều lớp trình trợ giúp, có thể có hoặc không riêng tư đối với lớp chính.
Gort Robot

@StevenBurnap Tôi đã loại bỏ c ++ làm ví dụ, vì bạn đúng.
Ampt

1
Nó cũng được thực hiện trong php để tạo điều kiện tự động tải. Mặt khác, trong php bạn có thể khai báo không gian tên một cách rõ ràng.
Bodo

Câu trả lời:


24

Tốt rồi. Nó cũng tốt trong C ++, để tham khảo.

Giữ những thứ gắn kết chặt chẽ với nhau là thực hành hợp lý. Tránh khớp nối không phù hợp cũng là thực hành tốt. Tạo ra sự cân bằng phù hợp không phải là vấn đề của các quy tắc nghiêm ngặt, nhưng, tốt, tạo ra sự cân bằng giữa các mối quan tâm khác nhau.

Một số quy tắc của ngón tay cái:

  1. Kích thước

    Các tệp quá lớn có thể xấu, nhưng đó không phải là trường hợp ở đây. Ugliness có lẽ là một lý do đủ tốt để phân chia một tệp, nhưng phát triển ý thức thẩm mỹ đó phần lớn là vấn đề kinh nghiệm, vì vậy nó không giúp bạn tìm ra cách làm tiên nghiệm

  2. Tách mối quan tâm

    Nếu việc triển khai cụ thể của bạn có những mối quan tâm nội bộ rất khác nhau, tệp duy nhất của bạn sẽ tích lũy tất cả những mối quan tâm đó. Ví dụ, việc triển khai với các phụ thuộc không chồng lấp làm cho tệp duy nhất của bạn phụ thuộc vào sự kết hợp của tất cả các phụ thuộc đó.

    Vì vậy, đôi khi có thể hợp lý khi xem xét khớp nối của các lớp con với các phụ thuộc của chúng vượt trội hơn so với khớp nối của chúng với giao diện (hoặc ngược lại, mối quan tâm của việc triển khai giao diện yếu hơn so với mối quan tâm bên trong việc triển khai đó).

    Như một ví dụ cụ thể, lấy một giao diện cơ sở dữ liệu chung. Việc triển khai cụ thể bằng cách sử dụng DB trong bộ nhớ, SQL RDBMS và truy vấn web tương ứng có thể không có gì chung ngoài giao diện và buộc mọi người muốn phiên bản trong bộ nhớ nhẹ cũng phải nhập thư viện SQL là khó chịu.

  3. Đóng gói

    Mặc dù bạn có thể viết các lớp được đóng gói tốt trong cùng một mô-đun, nhưng nó có thể khuyến khích việc ghép không cần thiết chỉ vì bạn có quyền truy cập vào các chi tiết triển khai mà nếu không sẽ được xuất bên ngoài mô-đun.

    Tôi nghĩ đây chỉ là phong cách kém, nhưng bạn có thể thi hành kỷ luật tốt hơn bằng cách tách mô-đun nếu bạn thực sự không thể phá vỡ thói quen.


2
Câu trả lời của bạn sẽ mạnh mẽ hơn nếu nó trích dẫn các tham chiếu bên ngoài thể hiện tính quy tắc của việc kết hợp các lớp trong một tệp hoặc bằng cách cung cấp thêm lời giải thích cho biết tại sao nó ổn.

1
Tôi đã chỉnh sửa câu hỏi để chỉ ra rằng đây đơn giản chỉ là một ví dụ về ý tôi và không thể hiện chính xác bản chất của câu hỏi. Tại sao giữ chúng trong cùng một tệp tốt hơn là chỉ nhập chúng khi cần thiết?
Ampt

Có nhiều tệp nhỏ có thể khó quản lý như có một vài tệp khổng lồ. Python là một ngôn ngữ khá ngắn gọn. Ví dụ của bạn cho thấy điều này. Ba lớp này có liên quan trực tiếp và có khả năng phù hợp trong một cửa sổ soạn thảo duy nhất mà không cần cuộn.
Gort Robot

1
@ GlenH7 - Tôi không chắc chắn về các tài liệu tham khảo, vì họ chỉ chuyển từ tôi đưa ra yêu cầu trực tiếp, với tôi tuyên bố rằng sự lựa chọn sai lệch của tôi là hợp lệ. Thay vào đó, tôi đã cố gắng tập trung vào lời giải thích.
Vô dụng

7

Tài liệu tham khảo thông thường của tôi để biết pythonic là gì.

Đơn giản là tốt hơn phức tạp.

Bằng phẳng là tốt hơn so với lồng nhau.

Từ Zen của Python

Hầu như không có ngoại lệ, tên lớp sử dụng quy ước Capemme.

Tên Mô-đun Gói và Mô-đun nên có tên viết tắt, tất cả chữ thường. [...] Tên mô-đun được ánh xạ tới tên tệp

Từ PEP 8

Giải thích của tôi là nó tốt vì nó sẽ giữ mọi thứ đơn giản và bằng phẳng. Ngoài ra, vì tên lớp và tên tệp có các trường hợp khác nhau, dù sao chúng không được coi là giống hệt nhau nên tôi sẽ không thấy bất kỳ vấn đề nào trong việc đóng gói nhiều lớp liên quan trong một tệp.


7
Bạn có thể giảm điều này xuống các phần liên quan đến câu hỏi? Tôi đã đọc cả hai lần này nhưng tôi gặp khó khăn trong việc chọn ra những phần đặc biệt liên quan đến câu hỏi hiện tại của tôi.
Ampt

1
Thật vậy, tôi đã chỉnh sửa câu trả lời của mình.
SylvainD

1

Những gì bạn có bây giờ là tốt. Đi và duyệt thư viện chuẩn - có rất nhiều mô-đun với nhiều lớp liên quan trong một tệp. Tại một số điểm, mọi thứ trở nên lớn hơn và cuối cùng bạn sẽ muốn bắt đầu sử dụng các mô-đun với nhiều tệp nhưng không có quy tắc thực sự nào khi nào. Mọi thứ chỉ bị chia tách khi một tệp bắt đầu cảm thấy 'quá lớn'.


0

Nó chắc chắn là ổn và tôi sẽ khuyến khích bạn có một vài lớp trong một tệp miễn là chúng được thực hiện. Nói chung, các lớp học của bạn nên duy trì ngắn gọn và súc tích và bạn nên phân chia hành vi trong hai hoặc nhiều lớp hơn là xây dựng các lớp nguyên khối khổng lồ. Khi viết một vài lớp nhỏ, điều thực sự cần thiết và hữu ích là giữ những lớp có liên quan trong cùng một tệp.


-1

Tóm lại - đúng rồi.

Hơn nữa, có nhiều lớp trong một tệp đôi khi rất tiện dụng. Một số gói ( six, bottle) gửi một cách rõ ràng trong một tệp duy nhất để dễ dàng được tích hợp vào bất kỳ mô-đun của bên thứ ba nào mà không được cài đặt pip (đôi khi mong muốn). Nhưng, hãy chắc chắn để tổ chức mã của bạn tốt. Sử dụng mạnh mẽ các bình luận mã và các khối tách để làm cho nó dễ đọc hơn.


3
điều này dường như không thêm bất cứ điều gì đáng kể vào câu trả lời trước được đăng cách đây vài năm
gnat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.