Làm thế nào để bạn lập trình một mẫu trong python?

Python là một ngôn ngữ lập trình cấp cao, dựa trên đối tượng, mạnh mẽ với khả năng gõ và liên kết động. Do tính linh hoạt và sức mạnh của nó, các nhà phát triển thường sử dụng các quy tắc nhất định hoặc các mẫu thiết kế Python. Điều gì làm cho chúng trở nên quan trọng và điều này có ý nghĩa gì đối với nhà phát triển Python bình thường?

Qua

Andrei Boyanov

Andrei là một chuyên gia CNTT có kinh nghiệm từ lập trình cấp thấp đến thiết kế và triển khai hệ thống phức tạp

CHIA SẺ

CHIA SẺ

Hãy nói lại lần nữa. Python là ngôn ngữ lập trình cấp cao với kiểu gõ động và liên kết động. Tôi sẽ mô tả nó như một ngôn ngữ năng động cấp cao, mạnh mẽ. Nhiều nhà phát triển yêu thích Python vì cú pháp rõ ràng, các mô-đun và gói có cấu trúc tốt, cũng như tính linh hoạt và hàng loạt tính năng hiện đại của nó

Trong Python, không có gì bắt buộc bạn phải viết các lớp và khởi tạo các đối tượng từ chúng. Nếu bạn không cần các cấu trúc phức tạp trong dự án của mình, bạn chỉ cần viết các hàm. Thậm chí tốt hơn, bạn có thể viết một tập lệnh phẳng để thực hiện một số tác vụ đơn giản và nhanh chóng mà không cần cấu trúc mã nào cả

Đồng thời Python là ngôn ngữ hướng đối tượng 100 phần trăm. Làm sao vậy? . Hàm là đối tượng, đối tượng hạng nhất (bất kể điều đó có nghĩa là gì). Thực tế này về các chức năng là các đối tượng là quan trọng, vì vậy hãy nhớ nó

Vì vậy, bạn có thể viết các tập lệnh đơn giản bằng Python hoặc chỉ cần mở thiết bị đầu cuối Python và thực thi các câu lệnh ngay tại đó (điều đó rất hữu ích. ). Nhưng đồng thời, bạn có thể tạo các khung, ứng dụng, thư viện phức tạp, v.v. Bạn có thể làm rất nhiều trong Python. Tất nhiên có một số hạn chế, nhưng đó không phải là chủ đề của bài viết này

Tuy nhiên, vì Python quá mạnh mẽ và linh hoạt nên chúng ta cần một số quy tắc (hoặc mẫu) khi lập trình trong đó. Vì vậy, hãy xem các mẫu là gì và chúng liên quan như thế nào đến Python. Chúng tôi cũng sẽ tiến hành triển khai một vài mẫu thiết kế Python cần thiết

Tại sao Python tốt cho các mẫu?

Bất kỳ ngôn ngữ lập trình nào cũng tốt cho các mẫu. Trên thực tế, các mẫu nên được xem xét trong ngữ cảnh của bất kỳ ngôn ngữ lập trình cụ thể nào. Cả các mẫu, cú pháp ngôn ngữ và bản chất đều áp đặt các hạn chế đối với chương trình của chúng tôi. Những hạn chế đến từ cú pháp ngôn ngữ và bản chất ngôn ngữ (động, chức năng, hướng đối tượng, v.v.) có thể khác nhau, cũng như lý do đằng sau sự tồn tại của chúng. Những hạn chế đến từ các mẫu là có lý do, chúng có mục đích. Đó là mục tiêu cơ bản của các mẫu; . Chúng ta sẽ nói về các mẫu và đặc biệt là các mẫu thiết kế Python sau

Python is a dynamic and flexible language. Python design patterns are a great way of harnessing its vast potential.

Python là một ngôn ngữ năng động và linh hoạt. Các mẫu thiết kế Python là một cách tuyệt vời để khai thác tiềm năng to lớn của nó

tiếng riu ríu

Triết lý của Python được xây dựng dựa trên ý tưởng về các phương pháp hay nhất được cân nhắc kỹ lưỡng. Python là một ngôn ngữ động (tôi đã nói rồi nhỉ?) và như vậy, đã triển khai hoặc làm cho nó dễ triển khai, một số mẫu thiết kế phổ biến với một vài dòng mã. Một số mẫu thiết kế được tích hợp sẵn trong Python, vì vậy chúng tôi sử dụng chúng ngay cả khi không biết. Các mẫu khác không cần thiết do bản chất của ngôn ngữ

Ví dụ: Factory là một mẫu thiết kế cấu trúc Python nhằm mục đích tạo các đối tượng mới, ẩn logic khởi tạo khỏi người dùng. Nhưng việc tạo các đối tượng trong Python là động theo thiết kế, vì vậy các bổ sung như Factory là không cần thiết. Tất nhiên, bạn có thể tự do thực hiện nó nếu bạn muốn. Có thể có những trường hợp nó thực sự hữu ích, nhưng đó là một ngoại lệ, không phải là tiêu chuẩn

Triết lý của Python có gì hay?

> >> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Đây có thể không phải là các mẫu theo nghĩa truyền thống, nhưng đây là những quy tắc xác định cách tiếp cận “Pythonic” để lập trình theo kiểu thanh lịch và hữu ích nhất

Chúng tôi cũng có các nguyên tắc mã PEP-8 giúp cấu trúc mã của chúng tôi. Tất nhiên đó là điều bắt buộc đối với tôi, với một số ngoại lệ thích hợp. Nhân tiện, những ngoại lệ này được khuyến khích bởi chính PEP-8

Nhưng quan trọng nhất. biết khi nào không nhất quán - đôi khi hướng dẫn phong cách không áp dụng. Khi nghi ngờ, hãy sử dụng phán đoán tốt nhất của bạn. Nhìn vào các ví dụ khác và quyết định những gì có vẻ tốt nhất. Và đừng ngần ngại hỏi

Kết hợp PEP-8 với The Zen of Python (cũng là PEP - PEP-20) và bạn sẽ có một nền tảng hoàn hảo để tạo mã có thể đọc và bảo trì được. Thêm Mẫu thiết kế và bạn đã sẵn sàng tạo mọi loại hệ thống phần mềm với tính nhất quán và khả năng phát triển

Mẫu thiết kế Python

Mẫu thiết kế là gì?

Mọi thứ bắt đầu với Gang of Four (GOF). Thực hiện tìm kiếm trực tuyến nhanh nếu bạn không quen thuộc với

Các mẫu thiết kế là một cách phổ biến để giải quyết các vấn đề nổi tiếng. Hai nguyên tắc chính nằm trong cơ sở của các mẫu thiết kế được xác định bởi GOF

  • Chương trình cho một giao diện không phải là một triển khai
  • Ưu tiên thành phần đối tượng hơn thừa kế

Hãy cùng xem xét kỹ hơn hai nguyên tắc này dưới góc nhìn của các lập trình viên Python

Chương trình cho một giao diện không phải là một triển khai

Nghĩ về Duck Typing. Trong Python, chúng ta không muốn định nghĩa các giao diện và lớp chương trình theo các giao diện này, phải không? . Điều này không có nghĩa là chúng tôi không nghĩ về giao diện, trên thực tế với Duck Typing, chúng tôi luôn làm điều đó

Hãy nói vài lời về cách tiếp cận Duck Typing khét tiếng để xem nó phù hợp như thế nào trong mô hình này. chương trình thành một giao diện

If it looks like a duck and quacks like a duck, it's a duck!

Nếu nó trông giống vịt và kêu quạc quạc như vịt, thì đó là vịt

tiếng riu ríu

Chúng ta không bận tâm đến bản chất của đối tượng, chúng ta không cần quan tâm đối tượng là gì;

Các đối tượng có thể lang thang?

try:
    bird.quack()
except AttributeError:
    self.lol()

Chúng tôi đã xác định giao diện cho con vịt của mình chưa? . Chúng tôi đã lập trình cho giao diện thay vì triển khai chưa? . Và, tôi thấy điều này thật tuyệt

Như Alex Martelli đã chỉ ra trong bài thuyết trình nổi tiếng của mình về Các mẫu thiết kế trong Python, “Dạy những con vịt đánh máy mất một lúc, nhưng giúp bạn tiết kiệm rất nhiều công việc sau đó. ”

Ưu tiên thành phần đối tượng hơn thừa kế

Bây giờ, đó là cái mà tôi gọi là nguyên tắc Pythonic. Tôi đã tạo ít lớp/lớp con hơn so với việc gói một lớp (hoặc thường xuyên hơn là nhiều lớp) trong một lớp khác

thay vì làm điều này

class User(DbObject):
    pass

Chúng ta có thể làm một cái gì đó như thế này

class User:
    _persist_methods = ['get', 'save', 'delete']

    def __init__(self, persister):
        self._persister = persister

    def __getattr__(self, attribute):
        if attribute in self._persist_methods:
            return getattr(self._persister, attribute)

Những lợi thế là rõ ràng. Chúng ta có thể hạn chế những phương thức nào của lớp được bao bọc để hiển thị. Chúng ta có thể đưa thể hiện của hồng cầu vào trong thời gian chạy. Ví dụ: hôm nay nó là một cơ sở dữ liệu quan hệ, nhưng ngày mai nó có thể là bất cứ thứ gì, với giao diện mà chúng ta cần (lại là những con vịt phiền phức đó)

Thành phần thanh lịch và tự nhiên đối với Python

Mẫu hành vi

Các mẫu hành vi liên quan đến giao tiếp giữa các đối tượng, cách các đối tượng tương tác và hoàn thành một nhiệm vụ nhất định. Theo nguyên tắc GOF, có tổng cộng 11 mẫu hành vi trong Python. Chuỗi trách nhiệm, Chỉ huy, Thông dịch viên, Iterator, Mediator, Memento, Observer, State, Strategy, Template, Visitor

Tôi thấy các mẫu này rất hữu ích, nhưng điều này không có nghĩa là các nhóm mẫu khác không

Trình lặp

Trình vòng lặp được tích hợp vào Python. Đây là một trong những đặc điểm mạnh mẽ nhất của ngôn ngữ. Nhiều năm trước, tôi đã đọc ở đâu đó rằng các trình vòng lặp làm cho Python trở nên tuyệt vời và tôi nghĩ đây vẫn là trường hợp. Tìm hiểu đủ về trình lặp và trình tạo Python và bạn sẽ biết mọi thứ bạn cần về mẫu Python cụ thể này

chuỗi trách nhiệm

Mẫu này cung cấp cho chúng tôi cách xử lý yêu cầu bằng các phương thức khác nhau, mỗi phương thức giải quyết một phần cụ thể của yêu cầu. Bạn biết đấy, một trong những nguyên tắc tốt nhất để viết mã tốt là nguyên tắc Trách nhiệm duy nhất

Mỗi đoạn mã phải làm một và chỉ một việc

Nguyên tắc này được tích hợp sâu sắc trong mẫu thiết kế này

Ví dụ: nếu chúng tôi muốn lọc một số nội dung, chúng tôi có thể triển khai các bộ lọc khác nhau, mỗi bộ lọc thực hiện một loại lọc chính xác và được xác định rõ ràng. Các bộ lọc này có thể được sử dụng để lọc các từ xúc phạm, quảng cáo, nội dung video không phù hợp, v.v.

class ContentFilter(object):
    def __init__(self, filters=None):
        self._filters = list()
        if filters is not None:
            self._filters += filters

    def filter(self, content):
        for filter in self._filters:
            content = filter(content)
        return content

filter = ContentFilter([
                offensive_filter,
                ads_filter,
                porno_video_filter])
filtered_content = filter.filter(content)

Chỉ huy

Đây là một trong những mẫu thiết kế Python đầu tiên tôi triển khai với tư cách là một lập trình viên. Điều đó nhắc nhở tôi. Các mẫu không được phát minh, chúng được khám phá. Chúng tồn tại, chúng ta chỉ cần tìm và đưa chúng vào sử dụng. Tôi phát hiện ra cái này cho một dự án tuyệt vời mà chúng tôi đã thực hiện nhiều năm trước. một trình soạn thảo XML WYSIWYM có mục đích đặc biệt. Sau khi sử dụng mẫu này một cách chuyên sâu trong mã, tôi đã đọc thêm về nó trên một số trang web

Mẫu lệnh rất hữu ích trong các tình huống khi vì lý do nào đó, chúng ta cần bắt đầu bằng cách chuẩn bị những gì sẽ được thực thi và sau đó thực hiện nó khi cần. Ưu điểm là việc đóng gói các hành động theo cách như vậy cho phép các nhà phát triển Python thêm các chức năng bổ sung liên quan đến các hành động đã thực hiện, chẳng hạn như hoàn tác/làm lại hoặc lưu giữ lịch sử các hành động và những thứ tương tự

Hãy xem một ví dụ đơn giản và được sử dụng thường xuyên trông như thế nào

class RenameFileCommand(object):
    def __init__(self, from_name, to_name):
        self._from = from_name
        self._to = to_name

    def execute(self):
        os.rename(self._from, self._to)

    def undo(self):
        os.rename(self._to, self._from)

class History(object):
    def __init__(self):
        self._commands = list()

    def execute(self, command):
        self._commands.append(command)
        command.execute()

    def undo(self):
        self._commands.pop().undo()

history = History()
history.execute(RenameFileCommand('docs/cv.doc', 'docs/cv-en.doc'))
history.execute(RenameFileCommand('docs/cv1.doc', 'docs/cv-bg.doc'))
history.undo()
history.undo()

Mô hình sáng tạo

Hãy bắt đầu bằng cách chỉ ra rằng các mẫu sáng tạo không được sử dụng phổ biến trong Python. Tại sao?

Ai đó khôn ngoan hơn tôi đã từng nói rằng Factory được tích hợp vào Python. Điều đó có nghĩa là bản thân ngôn ngữ cung cấp cho chúng ta tất cả sự linh hoạt mà chúng ta cần để tạo ra các đối tượng theo một phong cách đủ thanh lịch;

Trong một hướng dẫn về Mẫu thiết kế Python, tôi đã tìm thấy một mô tả về các mẫu thiết kế sáng tạo trong đó nêu rõ “các mẫu thiết kế này cung cấp một cách để tạo các đối tượng trong khi ẩn logic tạo, thay vì khởi tạo trực tiếp các đối tượng bằng cách sử dụng một toán tử mới. ”

Điều đó tổng hợp khá nhiều vấn đề. Chúng tôi không có toán tử mới trong Python

Tuy nhiên, hãy xem cách chúng ta có thể triển khai một số mẫu, nếu chúng ta cảm thấy mình có thể đạt được lợi thế bằng cách sử dụng các mẫu như vậy

Độc thân

Mẫu Singleton được sử dụng khi chúng tôi muốn đảm bảo rằng chỉ có một phiên bản của một lớp nhất định tồn tại trong thời gian chạy. Chúng ta có thực sự cần mẫu này trong Python không?

Nhưng nếu bạn muốn thực hiện nó, đây là một số tin tốt. Trong Python, chúng ta có thể thay đổi quy trình khởi tạo (cùng với hầu hết mọi thứ khác). Bạn có nhớ phương pháp

try:
    bird.quack()
except AttributeError:
    self.lol()
6 mà tôi đã đề cập trước đó không?

class Logger(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_logger'):
            cls._logger = super(Logger, cls
                    ).__new__(cls, *args, **kwargs)
        return cls._logger

Trong ví dụ này, Logger là một Singleton

Đây là những lựa chọn thay thế cho việc sử dụng Singleton trong Python

  • Sử dụng một mô-đun
  • Tạo một phiên bản ở đâu đó ở cấp cao nhất của ứng dụng của bạn, có lẽ trong tệp cấu hình
  • Truyền thể hiện cho mọi đối tượng cần nó. Đó là một tiêm phụ thuộc và đó là một cơ chế mạnh mẽ và dễ dàng làm chủ

Tiêm phụ thuộc

Tôi không có ý định thảo luận về việc liệu việc tiêm phụ thuộc có phải là một mẫu thiết kế hay không, nhưng tôi sẽ nói rằng đó là một cơ chế rất tốt để triển khai các khớp nối lỏng lẻo và nó giúp làm cho ứng dụng của chúng ta có thể bảo trì và mở rộng được. Kết hợp nó với Duck Typing và Thần lực sẽ ở bên bạn. Luôn

Tôi đã liệt kê nó trong phần mô hình sáng tạo của bài đăng này vì nó liên quan đến câu hỏi khi nào (hoặc thậm chí tốt hơn. ở đâu) đối tượng được tạo. Nó được tạo ra bên ngoài. Tốt hơn nên nói rằng các đối tượng hoàn toàn không được tạo ở nơi chúng ta sử dụng chúng, vì vậy sự phụ thuộc không được tạo ở nơi nó được sử dụng. Mã người tiêu dùng nhận đối tượng được tạo bên ngoài và sử dụng nó. Để tham khảo thêm, vui lòng đọc câu trả lời được đánh giá cao nhất cho câu hỏi Stackoverflow này

Đó là một lời giải thích hay về tiêm phụ thuộc và cho chúng ta ý tưởng hay về tiềm năng của kỹ thuật cụ thể này. Về cơ bản, câu trả lời giải thích vấn đề với ví dụ sau. Đừng tự lấy đồ uống từ tủ lạnh, thay vào đó hãy nêu nhu cầu. Nói với bố mẹ rằng bạn cần uống gì đó trong bữa trưa

Python cung cấp cho chúng tôi tất cả những gì chúng tôi cần để thực hiện điều đó một cách dễ dàng. Hãy nghĩ về khả năng triển khai của nó trong các ngôn ngữ khác như Java và C#, và bạn sẽ nhanh chóng nhận ra vẻ đẹp của Python

Hãy nghĩ về một ví dụ đơn giản về tiêm phụ thuộc

________số 8

Chúng tôi đưa các phương thức xác thực và ủy quyền vào lớp Lệnh. Tất cả những gì lớp Command cần là thực thi chúng thành công mà không cần bận tâm đến các chi tiết triển khai. Bằng cách này, chúng tôi có thể sử dụng lớp Lệnh với bất kỳ cơ chế xác thực và ủy quyền nào mà chúng tôi quyết định sử dụng trong thời gian chạy

Chúng tôi đã chỉ ra cách đưa các phụ thuộc thông qua hàm tạo, nhưng chúng tôi có thể dễ dàng đưa chúng vào bằng cách đặt trực tiếp các thuộc tính đối tượng, mở khóa nhiều tiềm năng hơn

command = Command()

if in_sudo_mode:
    command.authenticate = always_authenticated
    command.authorize = always_authorized
else:
    command.authenticate = config.authenticate
    command.authorize = config.authorize
command.execute(current_user, delete_user_action)

Còn nhiều điều nữa để tìm hiểu về tiêm phụ thuộc;

Nhưng trước khi bạn làm điều đó, hãy đọc một câu trả lời khác của Stackoverflow, câu trả lời được đánh giá cao nhất cho câu hỏi này

Một lần nữa, chúng tôi vừa chứng minh cách triển khai mẫu thiết kế tuyệt vời này trong Python chỉ là vấn đề sử dụng các chức năng tích hợp sẵn của ngôn ngữ

Đừng quên tất cả những điều này có nghĩa là gì. Kỹ thuật tiêm phụ thuộc cho phép thử nghiệm đơn vị rất linh hoạt và dễ dàng. Hãy tưởng tượng một kiến ​​trúc nơi bạn có thể thay đổi lưu trữ dữ liệu một cách nhanh chóng. Mocking một cơ sở dữ liệu trở thành một nhiệm vụ tầm thường, phải không?

Bạn cũng có thể muốn nghiên cứu các mẫu thiết kế Prototype, Builder và Factory

mô hình cấu trúc

mặt tiền

Đây rất có thể là mẫu thiết kế Python nổi tiếng nhất

Hãy tưởng tượng bạn có một hệ thống với số lượng đối tượng đáng kể. Mọi đối tượng đều cung cấp một bộ phương thức API phong phú. Bạn có thể làm rất nhiều thứ với hệ thống này, nhưng còn việc đơn giản hóa giao diện thì sao?

Facade is an elegant Python design pattern. It's a perfect way of streamlining the interface.

Mặt tiền là một mẫu thiết kế Python thanh lịch. Đó là một cách hoàn hảo để hợp lý hóa giao diện

tiếng riu ríu

Ví dụ mẫu thiết kế mặt tiền Python

try:
    bird.quack()
except AttributeError:
    self.lol()
0

Không có bất ngờ, không có mánh khóe, lớp

try:
    bird.quack()
except AttributeError:
    self.lol()
7 là một Mặt tiền, và đó là tất cả

bộ chuyển đổi

Nếu Mặt tiền được sử dụng để đơn giản hóa giao diện, thì Bộ điều hợp là để thay đổi giao diện. Giống như sử dụng một con bò khi hệ thống đang mong đợi một con vịt

Giả sử bạn có một phương thức hoạt động để ghi thông tin vào một đích nhất định. Phương thức của bạn mong muốn đích đến có phương thức

try:
    bird.quack()
except AttributeError:
    self.lol()
8 (chẳng hạn như mọi đối tượng tệp đều có)

try:
    bird.quack()
except AttributeError:
    self.lol()
0

Tôi muốn nói rằng đó là một phương pháp được viết tốt với nội dung phụ thuộc, cho phép khả năng mở rộng tuyệt vời. Giả sử bạn muốn đăng nhập vào một ổ cắm UDP nào đó thay vì vào một tệp, bạn biết cách mở ổ cắm UDP này nhưng vấn đề duy nhất là đối tượng

try:
    bird.quack()
except AttributeError:
    self.lol()
9 không có phương thức
try:
    bird.quack()
except AttributeError:
    self.lol()
8. Bạn cần một bộ chuyển đổi

try:
    bird.quack()
except AttributeError:
    self.lol()
1

Nhưng tại sao tôi thấy bộ chuyển đổi rất quan trọng? . Tại sao phải thay đổi mã đã được kiểm tra kỹ lưỡng của chúng tôi để hỗ trợ các giao diện mới khi chúng tôi chỉ có thể triển khai một bộ điều hợp sẽ dịch giao diện mới sang giao diện nổi tiếng?

Bạn cũng nên kiểm tra và nắm vững các mẫu thiết kế cầu nối và proxy, do tính tương đồng của chúng với bộ điều hợp. Hãy nghĩ xem chúng dễ triển khai như thế nào trong Python và nghĩ về những cách khác nhau mà bạn có thể sử dụng chúng trong dự án của mình

Người trang trí

Ôi chúng ta thật may mắn. Các công cụ trang trí thực sự rất đẹp và chúng tôi đã tích hợp chúng vào ngôn ngữ. Điều tôi thích nhất ở Python là việc sử dụng nó dạy chúng ta sử dụng các phương pháp hay nhất. Không phải là chúng ta không cần phải có ý thức về các phương pháp hay nhất (đặc biệt là các mẫu thiết kế), nhưng với Python, tôi cảm thấy như mình đang tuân theo các phương pháp hay nhất, bất kể. Cá nhân tôi thấy các phương pháp hay nhất của Python là trực quan và có bản chất thứ hai, và đây là điều được cả những nhà phát triển mới và ưu tú đánh giá cao

Mẫu trang trí là về việc giới thiệu chức năng bổ sung và đặc biệt, thực hiện nó mà không cần sử dụng tính kế thừa

Vì vậy, hãy xem cách chúng tôi trang trí một phương thức mà không cần sử dụng chức năng Python tích hợp. Đây là một ví dụ đơn giản

try:
    bird.quack()
except AttributeError:
    self.lol()
2

Điều không tốt ở đây là hàm

class User(DbObject):
    pass
1 làm được nhiều việc hơn là thực thi một cái gì đó. Chúng tôi không tuân theo nguyên tắc trách nhiệm duy nhất đối với bức thư

Sẽ tốt hơn nếu chỉ viết như sau

try:
    bird.quack()
except AttributeError:
    self.lol()
3

Chúng tôi có thể triển khai bất kỳ chức năng ủy quyền và xác thực nào ở một nơi khác, trong một trình trang trí, như vậy

try:
    bird.quack()
except AttributeError:
    self.lol()
4

Bây giờ phương pháp

class User(DbObject):
    pass
2 là

  • Đơn giản để đọc
  • Chỉ làm một việc (ít nhất là khi nhìn vào mã)
  • Được trang trí với xác thực
  • Được trang trí với sự ủy quyền

Chúng tôi viết tương tự bằng cách sử dụng cú pháp trình trang trí tích hợp của Python

try:
    bird.quack()
except AttributeError:
    self.lol()
5

Điều quan trọng cần lưu ý là bạn không bị giới hạn chức năng với tư cách là người trang trí. Một trang trí có thể liên quan đến toàn bộ lớp học. Yêu cầu duy nhất là chúng phải có thể gọi được. Nhưng chúng tôi không có vấn đề gì với điều đó;

Bạn cũng có thể muốn xem xét kỹ hơn mô-đun funcools của Python. Có nhiều điều để khám phá ở đó

Phần kết luận

Tôi đã chỉ ra cách sử dụng các mẫu thiết kế của Python một cách tự nhiên và dễ dàng như thế nào, nhưng tôi cũng đã chỉ ra cách lập trình bằng Python cũng sẽ dễ dàng như thế nào

“Đơn giản tốt hơn phức tạp,” hãy nhớ điều đó? . Không có triển khai toàn diện phức tạp nào được hiển thị. Bạn cần “cảm nhận” và thực hiện chúng theo cách phù hợp nhất với phong cách và nhu cầu của bạn. Python là một ngôn ngữ tuyệt vời và nó cung cấp cho bạn tất cả sức mạnh bạn cần để tạo mã linh hoạt và có thể tái sử dụng

Tuy nhiên, nó mang lại cho bạn nhiều hơn thế. Nó mang lại cho bạn “sự tự do” để viết những đoạn mã thực sự dở. Đừng làm điều đó. Không lặp lại chính mình (DRY) và không bao giờ viết các dòng mã dài hơn 80 ký tự. Và đừng quên sử dụng các mẫu thiết kế nếu có;

Đọc thêm trên Blog Kỹ thuật Toptal

  • Đảm bảo mã sạch. Nhìn vào Python, được tham số hóa
  • Hướng dẫn toàn diện về các mẫu thiết kế JavaScript
  • Python so với. r. Cú pháp ma thuật đường
  • Nguyên tắc trách nhiệm duy nhất. Một công thức cho mật mã tuyệt vời
  • Sáu điều răn của mã tốt. Viết mã vượt qua thử thách của thời gian

Thẻ

PythonPythonPatternsPythonDesignPatterns

Người làm việc tự do? Tìm công việc tiếp theo của bạn.

Việc làm Lập trình viên Python

Xem thông tin đầy đủ

Andrei Boyanov

Kỹ sư phần mềm cao cấp

Giới thiệu về tác giả

Andrei là một chuyên gia CNTT dày dạn kinh nghiệm với nhiều kinh nghiệm trong một số công nghệ phần mềm từ lập trình cấp thấp đến thiết kế và triển khai hệ thống phức tạp. Anh có kiến ​​thức sâu rộng (Prince 2 và Agile) và kinh nghiệm quản lý dự án. Ông cũng đã thực hiện thiết kế, mô hình hóa, phát triển, gỡ lỗi và tối ưu hóa phần mềm; . NET, C, Python, PHP, UML và LÊN

Thuê Andrei

Bình luận

Visar Elmazi

Awesome. You have to break your back twice in C#/Java to do awesomeness like this. Especially the functional decorator and DI. I prefer to decide the decorators at runtime in C# like this: static Action Y(Action x, IEnumerable, T>> y) { if (y.Count() == 0) return x; return Y(a => y.First()(x, a), y.Skip(1).Take(y.Count() - 1)); } Thin function Y depending on list of y decorators will decorate recursuvely: f = f1 ( f2 ( f3 ( ... fn (x) ) ) ) But it's limited to 1 argument only for type safety and speed. Don't know yet how to do it in Python but your article will help a lot. I LIKE THIS.

Visar Elmazi

Awesome. You have to break your back twice in C#/Java to do awesomeness like this. Especially the functional decorator and DI. I prefer to decide the decorators at runtime in C# like this: static Action Y(Action x, IEnumerable, T>> y) { if (y.Count() == 0) return x; return Y(a => y.First()(x, a), y.Skip(1).Take(y.Count() - 1)); } Thin function Y depending on list of y decorators will decorate recursuvely: f = f1 ( f2 ( f3 ( ... fn (x) ) ) ) But it's limited to 1 argument only for type safety and speed. Don't know yet how to do it in Python but your article will help a lot. I LIKE THIS.

Bernardo Leon

Nếu tôi hiểu rõ thì có một lỗi đánh máy ở đây. upd_logger = SocketWriter('1. 2. 3. 4', '9999') log('Đã xảy ra sự cố', đích udp) nội dung bạn đang chuyển tới nhật ký là upd_logger phải không? . Nếu python có thể xử lý các luồng độc đáo như Java thì thật tuyệt. Tuy nhiên cảm ơn bạn cho bài viết tuyệt vời này

Bernardo Leon

Nếu tôi hiểu rõ thì có một lỗi đánh máy ở đây. upd_logger = SocketWriter('1. 2. 3. 4', '9999') log('Đã xảy ra sự cố', đích udp) nội dung bạn đang chuyển tới nhật ký là upd_logger phải không? . Nếu python có thể xử lý các luồng độc đáo như Java thì thật tuyệt. Tuy nhiên cảm ơn bạn cho bài viết tuyệt vời này

Vladimir Voznesensky

Python mang lại rất nhiều sự tự do, nó cho phép các lập trình viên tự bắn nhau theo 100500 cách. Erlang không cho bạn nhiều tự do, nhưng bạn không cần các mẫu thiết kế để ngăn các lập trình viên của bạn bắn vào chân nhau. Vì vậy, hãy sử dụng Erlang để viết mã công nghiệp

Vladimir Voznesensky

Python mang lại rất nhiều sự tự do, nó cho phép các lập trình viên tự bắn nhau theo 100500 cách. Erlang không cho bạn nhiều tự do, nhưng bạn không cần các mẫu thiết kế để ngăn các lập trình viên của bạn bắn vào chân nhau. Vì vậy, hãy sử dụng Erlang để viết mã công nghiệp

Ivan Velichko

Tôi không thể nói điều gì về Erlang, tuy nhiên hầu như luôn luôn có một cách đúng duy nhất để làm điều gì đó trong Python. Hơn nữa, đó là một trong những tính năng chính của ngôn ngữ này. Trong khi bạn đang tìm cách phù hợp để tạo vòng lặp (thiết lập thuộc tính kế thừa, phân tích cú pháp ULR, v.v. ) trong nhiều ngôn ngữ khác như JS, Ruby, C++, v.v., trong Python, bạn có thể tập trung toàn bộ sự chú ý của mình trực tiếp vào các nhiệm vụ kinh doanh

Ivan Velichko

Tôi không thể nói điều gì về Erlang, tuy nhiên hầu như luôn luôn có một cách đúng duy nhất để làm điều gì đó trong Python. Hơn nữa, đó là một trong những tính năng chính của ngôn ngữ này. Trong khi bạn đang tìm cách phù hợp để tạo vòng lặp (thiết lập thuộc tính kế thừa, phân tích cú pháp ULR, v.v. ) trong nhiều ngôn ngữ khác như JS, Ruby, C++, v.v., trong Python, bạn có thể tập trung toàn bộ sự chú ý của mình trực tiếp vào các nhiệm vụ kinh doanh

Thomas Maurin

Bài đăng tuyệt vời, ví dụ tuyệt vời. Cảm ơn. Có lẽ bạn có thể mở rộng tuyên bố của mình liên quan đến Nhà máy? . ) Tôi không chắc bạn hiểu những gì bạn nghĩ về điều đó

Thomas Maurin

Bài đăng tuyệt vời, ví dụ tuyệt vời. Cảm ơn. Có lẽ bạn có thể mở rộng tuyên bố của mình liên quan đến Nhà máy? . ) Tôi không chắc bạn hiểu những gì bạn nghĩ về điều đó

Miguel

tôi đã có cùng mối quan tâm. )

Miguel

tôi đã có cùng mối quan tâm. )

Miguel

blagodarya Andrei bài viết rất hay, bài viết rất hay và chủ đề rất hay. Bạn khiến tôi muốn mở lại cuốn sách GoF của mình và cũng nhắc nhở tôi rằng tôi đang nhớ python nhiều như thế nào ngay cả khi trải nghiệm của tôi với ngôn ngữ này chỉ là khoảng 6 tháng.

Miguel

blagodarya Andrei bài viết rất hay, bài viết rất hay và chủ đề rất hay. Bạn khiến tôi muốn mở lại cuốn sách GoF của mình và cũng nhắc nhở tôi rằng tôi đang nhớ python nhiều như thế nào ngay cả khi trải nghiệm của tôi với ngôn ngữ này chỉ là khoảng 6 tháng.

Vladimir Voznesensky

Ivan, có ít nhất ba cách chính thức để tạo một vòng lặp trong Python. bởi for/while, bởi iterables (hàm bản đồ/hàm giảm/v.v. ) và bằng đệ quy

Vladimir Voznesensky

Ivan, có ít nhất ba cách chính thức để tạo một vòng lặp trong Python. bởi for/while, bởi iterables (hàm bản đồ/hàm giảm/v.v. ) và bằng đệ quy

Ivan Velichko

Hãy bỏ qua đệ quy vì nó không liên quan đến cú pháp ngôn ngữ và xem xét lời nhắc. Mỗi cách này có một kịch bản thích hợp hơn để sử dụng trong. Sử dụng `for` để lặp qua các bộ sưu tập (vâng, tôi biết về phạm vi/xrange), sử dụng `while` để lặp trong khi một số biểu thức được giữ (bao gồm cả việc tạo các vòng lặp cho N lần lặp, vì `for _ trong phạm vi (42)` rất xấu trong . Và bây giờ chúng ta hãy xem, ví dụ, tại Ruby. Tôi thích Ruby, nó giống như một viên kim cương lấp lánh. Tuy nhiên, đây là những cách bạn có thể tạo vòng lặp cho N lần lặp. ` cho tôi trong 1. 1000 làm. kết thúc` `(1. 100). mỗi người làm. i. . kết thúc` `10. lần làm. i. . kết thúc` `10. lần {. i. . }` ` 1. đến 10). `` 10. cuối cùng(1). `` while` và có thể cái gì đó khác. Tôi sử dụng từ `vòng lặp` trong nhận xét ban đầu của mình như một sự cường điệu. Tuy nhiên, người ta có thể thấy rằng nó thực sự hoạt động ngay cả với các vòng lặp. Theo tôi, lý do chính của việc "có một cách đúng đắn" so với "lang không hạn chế bạn cách làm" là ở triết lý ngôn ngữ. Và tôi thích cách tiếp cận của Python

Ivan Velichko

Hãy bỏ qua đệ quy vì nó không liên quan đến cú pháp ngôn ngữ và xem xét lời nhắc. Mỗi cách này có một kịch bản thích hợp hơn để sử dụng trong. Sử dụng `for` để lặp qua các bộ sưu tập (vâng, tôi biết về phạm vi/xrange), sử dụng `while` để lặp trong khi một số biểu thức được giữ (bao gồm cả việc tạo các vòng lặp cho N lần lặp, vì `for _ trong phạm vi (42)` rất xấu trong . Và bây giờ chúng ta hãy xem, ví dụ, tại Ruby. Tôi thích Ruby, nó giống như một viên kim cương lấp lánh. Tuy nhiên, đây là những cách bạn có thể tạo vòng lặp cho N lần lặp. ` cho tôi trong 1. 1000 làm. kết thúc` `(1. 100). mỗi người làm. i. . kết thúc` `10. lần làm. i. . kết thúc` `10. lần {. i. . }` ` 1. đến 10). `` 10. cuối cùng(1). `` while` và có thể cái gì đó khác. Tôi sử dụng từ `vòng lặp` trong nhận xét ban đầu của mình như một sự cường điệu. Tuy nhiên, người ta có thể thấy rằng nó thực sự hoạt động ngay cả với các vòng lặp. Theo tôi, lý do chính của việc "có một cách đúng đắn" so với "lang không hạn chế bạn cách làm" là ở triết lý ngôn ngữ. Và tôi thích cách tiếp cận của Python

Vladimir Voznesensky

Bạn thích các mẫu thiết kế của Python, PEP8, v.v. địa ngục vì nó mang lại cho bạn rất nhiều tự do và nó đưa bạn vào vị trí trung tâm của quá trình phát triển như một bậc thầy không thể thiếu. Chà, mọi người đều thích trở thành nhân viên không thể thiếu, nhưng cơn ác mộng của mọi nhà tuyển dụng là đối phó với những nhân viên không thể thiếu. Dù sao, chủ trả tiền và đặt hàng âm nhạc. Vì vậy, tôi cảnh báo các nhà tuyển dụng. Đừng tin tưởng các bậc thầy Python, hãy xem xét Erlang chức năng tự hạn chế của doanh nghiệp

Vladimir Voznesensky

Bạn thích các mẫu thiết kế của Python, PEP8, v.v. địa ngục vì nó mang lại cho bạn rất nhiều tự do và nó đưa bạn vào vị trí trung tâm của quá trình phát triển như một bậc thầy không thể thiếu. Chà, mọi người đều thích trở thành nhân viên không thể thiếu, nhưng cơn ác mộng của mọi nhà tuyển dụng là đối phó với những nhân viên không thể thiếu. Dù sao, chủ trả tiền và đặt hàng âm nhạc. Vì vậy, tôi cảnh báo các nhà tuyển dụng. Đừng tin tưởng các bậc thầy Python, hãy xem xét Erlang chức năng tự hạn chế của doanh nghiệp

nhuyễn thể klev

bài đăng tuyệt vời. Đây là hướng dẫn về trình trang trí python mà tôi thích nhất - http. //Blog. thông minh. com/python-decorator-tutorial-with-example. html

nhuyễn thể klev

bài đăng tuyệt vời. Đây là hướng dẫn về trình trang trí python mà tôi thích nhất - http. //Blog. thông minh. com/python-decorator-tutorial-with-example. html

Syed Uzair Ahmad

Người đàn ông tuyệt vời, Yêu nó

Syed Uzair Ahmad

Người đàn ông tuyệt vời, Yêu nó

Baoshan Gu

bài đăng tuyệt vời. Cảm ơn. Trong ví dụ về bộ điều hợp, tôi tin rằng udp_destination phải là upd_logger

Baoshan Gu

bài đăng tuyệt vời. Cảm ơn. Trong ví dụ về bộ điều hợp, tôi tin rằng udp_destination phải là upd_logger

Muhammad Azhar

Vâng, đây phải là udp_logger. Tôi cũng nghĩ như vậy tại sao udp_destination lol

Muhammad Azhar

Vâng, đây phải là udp_logger. Tôi cũng nghĩ như vậy tại sao udp_destination lol

vivek keshore

Đó là một bài đọc thực sự nhiều thông tin. Cảm ơn rất nhiều

vivek keshore

Đó là một bài đọc thực sự nhiều thông tin. Cảm ơn rất nhiều

Aaron Fowles

Bài đăng tuyệt vời - cảm ơn

Aaron Fowles

Bài đăng tuyệt vời - cảm ơn

Rajendra Kumar

Bài viết xuất sắc. Cảm ơn bạn đã chia sẻ thông tin có giá trị bằng ngôn ngữ dễ hiểu và dễ hiểu

Rajendra Kumar

Bài viết xuất sắc. Cảm ơn bạn đã chia sẻ thông tin có giá trị bằng ngôn ngữ dễ hiểu và dễ hiểu

György K-Tim

Xin chào. Chà, đó là một bài viết rất ấn tượng về DP và tôi muốn chia sẻ một số thông tin bổ sung về người trang trí. Nếu trang trí được sử dụng, phải cẩn thận theo thứ tự của các chức năng. Vì vậy, tôi đã viết một kịch bản đơn giản để chứng minh cách sử dụng này. # from funcools import kết thúc hàm def function_1(hàm). in ('chức năng1. {}'. định dạng (chức năng. __name__)) # @wraps(function) def wrapper1(*args, **kwargs). in ('trình bao bọc1 trong hàm1. {}'. định dạng (chức năng. __name__)) #print('Các đối số. {} và kwargs. {}'. định dạng(args, kwargs)) hàm trả về(*args, **kwargs) trả về trình bao bọc1 hàm def_2(hàm). in ('chức năng2. {}'. định dạng (chức năng. __name__)) # @wraps(function) def wrapper2(*args, **kwargs). in ('trình bao bọc2 trong hàm2. {}'. định dạng (chức năng. __name__)) #print('Các đối số. {} và kwargs. {}'. định dạng(args, kwargs)) hàm trả về(*args, **kwargs) trả về trình bao bọc2 @function_1 @function_2 in def(chuỗi, số). print('--- in thông tin. ( {}, {} ) ---\n\n'. định dạng (chuỗi, số)) in ('test', 33) Trong trường hợp này, đầu ra là. chức năng2. chức năng in1. trình bao bọc2 trình bao bọc1 trong hàm1. trình bao bọc2 trình bao bọc2 trong hàm2. in --- thông tin in. ( test, 33 ) --- Trong trường hợp khác, tôi hoán đổi các lời gọi decorator. @function_2 @function_1 và kết quả là. chức năng1. chức năng in2. trình bao bọc1 trình bao bọc2 trong hàm2. trình bao bọc1 trình bao bọc1 trong hàm1. in --- thông tin in. ( test, 33 ) --- Vì vậy, kết quả đầu ra bị nhầm lẫn một chút. Tại sao tên trình bao bọc2 trình bao bọc1 trong hàm2? . Nó giống như một cuộc gọi chéo. Tôi nghĩ những giải pháp này không được mong đợi. Và bước cuối cùng, nếu tôi sử dụng funcools và kết thúc tốt đẹp. chức năng2. chức năng in1. in bao bọc1 trong hàm1. in wrapper2 trong function2. in --- thông tin in. ( test, 33 ) --- Theo mình thì mỗi người một mục đích khác nhau, nhưng trình tự chức năng thì cần phải kiểm chứng rồi mới quyết định. cảm ơn

György K-Tim

Xin chào. Chà, đó là một bài viết rất ấn tượng về DP và tôi muốn chia sẻ một số thông tin bổ sung về người trang trí. Nếu trang trí được sử dụng, phải cẩn thận theo thứ tự của các chức năng. Vì vậy, tôi đã viết một kịch bản đơn giản để chứng minh cách sử dụng này. # from funcools import kết thúc hàm def function_1(hàm). in ('chức năng1. {}'. định dạng (chức năng. __name__)) # @wraps(function) def wrapper1(*args, **kwargs). in ('trình bao bọc1 trong hàm1. {}'. định dạng (chức năng. __name__)) #print('Các đối số. {} và kwargs. {}'. định dạng(args, kwargs)) hàm trả về(*args, **kwargs) trả về trình bao bọc1 hàm def_2(hàm). in ('chức năng2. {}'. định dạng (chức năng. __name__)) # @wraps(function) def wrapper2(*args, **kwargs). in ('trình bao bọc2 trong hàm2. {}'. định dạng (chức năng. __name__)) #print('Các đối số. {} và kwargs. {}'. định dạng(args, kwargs)) hàm trả về(*args, **kwargs) trả về trình bao bọc2 @function_1 @function_2 in def(chuỗi, số). print('--- in thông tin. ( {}, {} ) ---\n\n'. định dạng (chuỗi, số)) in ('test', 33) Trong trường hợp này, đầu ra là. chức năng2. chức năng in1. trình bao bọc2 trình bao bọc1 trong hàm1. trình bao bọc2 trình bao bọc2 trong hàm2. in --- thông tin in. ( test, 33 ) --- Trong trường hợp khác, tôi hoán đổi các lời gọi decorator. @function_2 @function_1 và kết quả là. chức năng1. chức năng in2. trình bao bọc1 trình bao bọc2 trong hàm2. trình bao bọc1 trình bao bọc1 trong hàm1. in --- thông tin in. ( test, 33 ) --- Vì vậy, kết quả đầu ra bị nhầm lẫn một chút. Tại sao tên trình bao bọc2 trình bao bọc1 trong hàm2? . Nó giống như một cuộc gọi chéo. Tôi nghĩ những giải pháp này không được mong đợi. Và bước cuối cùng, nếu tôi sử dụng funcools và kết thúc tốt đẹp. chức năng2. chức năng in1. in bao bọc1 trong hàm1. in wrapper2 trong function2. in --- thông tin in. ( test, 33 ) --- Theo mình thì mỗi người một mục đích khác nhau, nhưng trình tự chức năng thì cần phải kiểm chứng rồi mới quyết định. cảm ơn

György K-Tim

Úi. tôi quên mất cái gì đó. Ý tưởng của tôi nên sử dụng nếu ví dụ cần ghi nhật ký chức năng. Trong trường hợp này, hàm_1 là hàm ghi nhật ký và nó ghi vào một tệp có tên là hàm. __Tên__. Với việc sử dụng @wraps mỗi khi tên của tệp nhật ký sẽ chính xác

György K-Tim

Úi. tôi quên mất cái gì đó. Ý tưởng của tôi nên sử dụng nếu ví dụ cần ghi nhật ký chức năng. Trong trường hợp này, hàm_1 là hàm ghi nhật ký và nó ghi vào một tệp có tên là hàm. __Tên__. Với việc sử dụng @wraps mỗi khi tên của tệp nhật ký sẽ chính xác

Đê Erika

Cảm ơn bạn cho một bài tuyệt vời. Một vài điều đã được làm rõ hơn. Tôi thấy ví dụ về thành phần ưu tiên so với thừa kế thực sự hữu ích. Tôi nghĩ rằng đây có thể là một cách tuyệt vời để mô phỏng việc cho phép người tiêu dùng trong lớp của bạn chỉ truy cập vào các phương thức công khai thay vì chỉ đặt dấu gạch dưới trước các phương thức của bạn

Đê Erika

Cảm ơn bạn cho một bài tuyệt vời. Một vài điều đã được làm rõ hơn. Tôi thấy ví dụ về thành phần ưu tiên so với thừa kế thực sự hữu ích. Tôi nghĩ rằng đây có thể là một cách tuyệt vời để mô phỏng việc cho phép người tiêu dùng trong lớp của bạn chỉ truy cập vào các phương thức công khai thay vì chỉ đặt dấu gạch dưới trước các phương thức của bạn

Aditya Padwal

Một trong những cách tốt nhất để giải thích các mẫu thiết kế Python

Aditya Padwal

Một trong những cách tốt nhất để giải thích các mẫu thiết kế Python

KENMEUGNE TCHUINKAM Romuald Fr

cùng mối quan tâm

KENMEUGNE TCHUINKAM Romuald Fr

cùng mối quan tâm

Dấu gạch ngang Priyabrata

bài viết rất tốt và ví dụ rất tốt. Cảm ơn bạn

Dấu gạch ngang Priyabrata

bài viết rất tốt và ví dụ rất tốt. Cảm ơn bạn

Anik Saxena

Tôi đánh giá cao công việc của bạn trên Python. Đó là một bài đọc tuyệt vời về khóa học Python. Tiếp tục chia sẻ những thứ như thế này. Tôi cũng đang hướng dẫn mọi người về đào tạo Python tương tự, vì vậy nếu bạn muốn biết thêm, bạn có thể xem hướng dẫn Python này. -https. //www. youtube. com/watch?v=HcsvDObzW2U

Anik Saxena

Tôi đánh giá cao công việc của bạn trên Python. Đó là một bài đọc tuyệt vời về khóa học Python. Tiếp tục chia sẻ những thứ như thế này. Tôi cũng đang hướng dẫn mọi người về đào tạo Python tương tự, vì vậy nếu bạn muốn biết thêm, bạn có thể xem hướng dẫn Python này. -https. //www. youtube. com/watch?v=HcsvDObzW2U

Donata S

Tôi tự hỏi tại sao bạn sử dụng "lớp abc(đối tượng). " chứ không phải "lớp abc. ". Có một sự khác biệt?

Donata S

Tôi tự hỏi tại sao bạn sử dụng "lớp abc(đối tượng). " chứ không phải "lớp abc. ". Có một sự khác biệt?

Sandro Regis Cardoso

Cách tiếp cận tốt, nhưng quá nhiều nội dung hời hợt

Sandro Regis Cardoso

Cách tiếp cận tốt, nhưng quá nhiều nội dung hời hợt

lập trình máy bay không người lái

Python không thể được gọi là Hướng đối tượng 100% vì nó không cung cấp các công cụ sửa đổi quyền truy cập (công khai/riêng tư, v.v.), đây là nguyên tắc cơ bản của OOP. Vì vậy, Python không cung cấp thông tin ẩn giữa các nguyên tắc OOP khác. Ngoài ra, làm thế nào một tập lệnh đơn giản được viết bằng Python có thể được coi là hướng đối tượng?

Joshua Faulu

Đi đọc Python

lập trình máy bay không người lái

Có lẽ bạn có thể khai sáng cho tôi với một tài liệu tham khảo về chủ đề. Nếu không thì giống với bạn

stacktraceguru

Very nice and easy explaination of adapter desing pattern. I have found a link which i would like to share for other readers for java. Adapter design pattern in java

Alexis Rodríguez

Hãy thử thực hiện các chức năng của nhà máy. def socketWriter(ip, cổng). --socket = ổ cắm. ổ cắm (ổ cắm. AF_INET, ổ cắm. SOCK_DGRAM) --socket. viết = lambda tự. bản thân. send(message, ip, port) --return socket Việc đóng IMO có thể đơn giản hóa mẫu lệnh. def file_renamer(đến, từ, os=os). # os=myos cho phép bạn mô phỏng mô-đun os của mình --renamefunc = lambda to=to, from=from. hệ điều hành. đổi tên (thành, từ) --renamefunc. hoàn tác = lambda đến = đến, từ = từ. hệ điều hành. đổi tên (từ, thành) --return renamefunc

Alexis Rodríguez

* Đệ quy chỉ được sử dụng cho thuật toán đệ quy đầu (cây) và đồ thị (tổng quát hóa cây). * For/while dành cho "đệ quy đuôi"; . e. làm điều gì đó với nhiều thứ là TUYÊN BỐ (biến đổi nội dung hoặc truyền bá trạng thái toàn cầu tiềm ẩn thông qua phép gán hoặc thủ tục) * Trình lặp (zip, hiểu trình tạo, bản đồ, bộ lọc, hoạt động ma trận numpy) là để thực hiện nhiều việc là EXPRESSION (không . Nói chung không nên sử dụng giảm, thay vào đó hãy sử dụng bất kỳ, tất cả, tối đa, tối thiểu, trung bình, tổng, sản phẩm, ''. tham gia()

Làm cách nào để in 12345 bằng Python?

cách in 12345 trong một hàng mà không cần sử dụng chuỗi .
+ 8. print(*(n for n in range(1,6)), sep="") hoặc chỉ print(12345) theo đề xuất của Diego. .
+ 6. Ngôn ngữ - Python Điều này có thể gian lận nhưng hãy thử. số = 12345; . .
+ 5. .
+ 3. .
+ 2. .
+ 2. .
+ 1. .

Có bao nhiêu loại mẫu trong Python?

18 Ví dụ về Chương trình Mẫu trong Python.

Chương trình mẫu hoạt động như thế nào?

Những thứ này có thể được hiển thị bằng C nếu bạn nắm vững các vòng lặp, i. e. , vòng lặp for và while. Một chương trình mẫu trong C thường chứa các vòng lặp lồng nhau trong đó vòng lặp bên ngoài kiểm soát số lượng hàng và vòng lặp bên trong kiểm soát dữ liệu trong mỗi hàng chứa nội dung sẽ được in.