Hướng dẫn can you have multiple python classes in one file? - bạn có thể có nhiều lớp python trong một tệp không?

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ể sử dụng thay đổi một chút. Tôi đã đăng một tệp 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 sự khác biệt thực hiện bên dưới đó.

Câu hỏi: Tiêu chuẩn này cho Python, hay cho bất kỳ ngôn ngữ nào? Những vấn đề nào có thể phát sinh từ việc sử dụng triển khai này nếu có? Is this standard for python, or for any language? What problems could arise from using this implementation if any?

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

Có thể trùng lặp: Tôi nên đặt bao nhiêu lớp Python trong một tệp?
How many Python classes should I put in one file?

Đến từ nền C ++ mà tôi đã quen với việc tổ chức các lớp học của mình sao cho phần lớn, có tỷ lệ 1: 1 giữa các lớp và tệp. Bằng cách làm cho nó để một tệp duy nhất chứa một lớp duy nhất, tôi thấy mã có thể điều hướng hơn. Khi tôi giới thiệu bản thân với Python, tôi tìm thấy rất nhiều ví dụ trong đó một tệp duy nhất chứa nhiều lớp. Đó có phải là cách làm việc được đề xuất trong Python? Nếu vậy, tại sao?

Tôi có bỏ lỡ quy ước này trong PEP8 không?

Hướng dẫn can you have multiple python classes in one file? - bạn có thể có nhiều lớp python trong một tệp không?

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges

Đã hỏi ngày 7 tháng 7 năm 2009 lúc 11:14Jul 7, 2009 at 11:14

Hướng dẫn can you have multiple python classes in one file? - bạn có thể có nhiều lớp python trong một tệp không?

1

Dưới đây là một số lý do có thể:

  1. Python không chỉ dựa trên lớp - đơn vị tự nhiên của phân tách mã trong Python là mô -đun. Các mô-đun có khả năng chứa các hàm (là các đối tượng hạng nhất trong Python) dưới dạng các lớp. Trong Java, đơn vị phân hủy là lớp. Do đó, Python có một mô -đun = một tệp và Java có một lớp (công khai) = một tệp.
  2. Python biểu cảm hơn nhiều so với Java và nếu bạn giới hạn bản thân ở một lớp cho mỗi tệp (mà Python không ngăn bạn làm), bạn sẽ kết thúc với rất nhiều tệp rất nhỏ - nhiều hơn để theo dõi rất ít lợi ích.

Một ví dụ về chức năng gần tương đương: log4j của java => một vài tá tệp, ~ 8000 sloc. Ghi nhật ký Python => 3 Tệp, ~ 2800 Sloc.

Hướng dẫn can you have multiple python classes in one file? - bạn có thể có nhiều lớp python trong một tệp không?

JPP

153K32 Huy hiệu vàng261 Huy hiệu bạc320 Huy hiệu đồng32 gold badges261 silver badges320 bronze badges

Đã trả lời ngày 7 tháng 7 năm 2009 lúc 11:28Jul 7, 2009 at 11:28

Vinay Sajipvinay SajipVinay Sajip

92.6K14 Huy hiệu vàng174 Huy hiệu bạc184 Huy hiệu đồng14 gold badges174 silver badges184 bronze badges

Có một câu thần chú, "Căn hộ tốt hơn so với lồng nhau", thường không khuyến khích lạm dụng hệ thống phân cấp. Tôi không chắc chắn có bất kỳ quy tắc khó và nhanh nào khi bạn muốn tạo một mô -đun mới - đối với hầu hết mọi người, mọi người chỉ sử dụng quyền của họ để nhóm các chức năng liên quan đến logic (các lớp và chức năng liên quan đến một miền vấn đề cụ thể) .

Chủ đề tốt từ danh sách gửi thư Python và trích dẫn của Fredrik Lundh:

Điều quan trọng hơn nữa là trong Python, bạn không sử dụng các lớp học cho mọi thứ; Nếu bạn cần các nhà máy, singletons, nhiều cách để tạo đối tượng, người trợ giúp đa hình, v.v., bạn sử dụng các hàm đơn giản, không phải các lớp hoặc phương pháp tĩnh.

Khi bạn đã vượt qua "tất cả các lớp", hãy sử dụng các mô -đun để sắp xếp mọi thứ theo cách có ý nghĩa với mã sử dụng các thành phần của bạn. Làm cho các báo cáo nhập hình trông tốt.
make the import statements look good.

Đã trả lời ngày 7 tháng 7 năm 2009 lúc 11:19Jul 7, 2009 at 11:19

CDLearycdlearycdleary

67.9K52 Huy hiệu vàng161 Huy hiệu bạc191 Huy hiệu Đồng52 gold badges161 silver badges191 bronze badges

1

Chuyên gia sách Python Lập trình có một cái gì đó liên quan Thảo luận Chương 4: Chọn tên tốt: "Xây dựng cây không gian tên" và "chia mã" Tóm tắt dòng thô của tôi: Thu thập một số lớp liên quan đến một mô -đun (tệp nguồn) và thu thập một số mô -đun liên quan Đối với một gói, là hữu ích cho việc duy trì mã.
Chapter 4: Choosing Good Names:"Building the Namespace Tree" and "Splitting the Code"
My line crude summary: collect some related class to one module(source file),and collect some related module to one package, is helpful for code maintain.

Đã trả lời ngày 7 tháng 7 năm 2009 lúc 11:32Jul 7, 2009 at 11:32

Sunqiangsunqiangsunqiang

6.3641 Huy hiệu vàng31 Huy hiệu bạc32 Huy hiệu đồng1 gold badge31 silver badges32 bronze badges

Trong Python, lớp cũng có thể được sử dụng cho các nhiệm vụ nhỏ (chỉ để nhóm, v.v.). Việc duy trì mối quan hệ 1: 1 sẽ dẫn đến việc có quá nhiều tệp có chức năng nhỏ hoặc ít.

Đã trả lời ngày 7 tháng 7 năm 2009 lúc 11:18Jul 7, 2009 at 11:18

Umair Ahmedumair AhmedUmair Ahmed

10,9k5 Huy hiệu vàng31 Huy hiệu bạc38 Huy hiệu đồng5 gold badges31 silver badges38 bronze badges

Không có quy ước cụ thể nào cho việc này - làm bất cứ điều gì làm cho mã của bạn dễ đọc và duy trì nhất.

Đã trả lời ngày 7 tháng 7 năm 2009 lúc 11:19Jul 7, 2009 at 11:19

RichiehindlerichiehindleRichieHindle

264K46 Huy hiệu vàng354 Huy hiệu bạc395 Huy hiệu Đồng46 gold badges354 silver badges395 bronze badges

Một ví dụ điển hình về việc không có các tệp riêng biệt cho mỗi lớp có thể là tệp model.py trong ứng dụng django. Mỗi ứng dụng Django có thể có một số lớp có liên quan đến ứng dụng đó và đưa chúng vào các tệp riêng lẻ chỉ làm cho nhiều công việc hơn.

Tương tự, có mỗi chế độ xem trong một tệp khác nhau có thể sẽ phản tác dụng.

Đã trả lời ngày 7 tháng 7 năm 2009 lúc 12:41Jul 7, 2009 at 12:41

Matthew Schinckelmatthew SchinckelMatthew Schinckel

34.3K6 Huy hiệu vàng81 Huy hiệu bạc119 Huy hiệu đồng6 gold badges81 silver badges119 bronze badges

2

Bạn có thể có nhiều lớp trong một tệp không?

Trả lời: Không có hạn chế về số lượng các lớp có thể có trong một chương trình Java. Nhưng mỗi chương trình Java chỉ nên có một lớp được khai báo với trình xác định truy cập công khai. Không thể có hai lớp công khai trong một chương trình Java duy nhất.There are no restrictions on the number of classes that can be present in one Java program. But each Java program should have only one class declared with public access specifier. There cannot be two public classes in a single Java program.

Bạn có thể có 2 lớp học trong Python không?

Như tất cả chúng ta đều biết, Python hỗ trợ nhiều kế thừa, có nghĩa là gì, trong Python, một lớp có thể kế thừa các tính năng và thuộc tính từ nhiều lớp.Python supports multiple inheritance, what means, in Python, a class can inherit features and attributes from multiple classes.

Chúng ta có thể xác định hai lớp trong cùng một tệp không?

Trong C ++, bạn có thể xác định nhiều lớp bên trong một tệp.Bạn sẽ không gặp rắc rối bằng cách làm điều đó.Bạn sẽ giải thích "Bạn sẽ không gặp rắc rối"?Câu trả lời của bạn trái ngược với những người khác.you can define multiple classes inside of a single file. You will not run into trouble by doing it. Would you elaborate "You will not run into trouble"? Your answer is opposite to the others.

Mỗi lớp Python có nên nằm trong một tệp riêng biệt không?

Không cần phải giữ từng lớp trong một tệp riêng biệt, nhưng nếu nó quá lớn hoặc không quan trọng, việc giữ trong một tệp riêng biệt có thể giúp bạn đôi khi.Nếu bạn cần sử dụng lại một lớp cho dự án khác của bạn, thật dễ dàng để có được điều đó khi bạn cần., but if it is too large class or imporatant, keeping in a seperate file might help you sometimes. If you need to reuse a class for your another project it is easy to go get that when you need.