Hướng dẫn anonymous inner class python - con trăn lớp bên trong ẩn danh

Chắc chắn, bạn có thể (mặc dù có lẽ không nên) chỉ cần sử dụng type:

In [1]: class Button:
   ...:     def callback(self):
   ...:         print('Hello')
   ...:         


In [2]: button = type('', (Button,), {'callback': lambda self: print('World')})()

In [3]: button.callback()
World

Bạn có thể thích xác định chức năng bên ngoài biểu thức, để có thể tránh được mã golf Code:

In [5]: def callback(self):
   ...:     print('World')
   ...: button = type('', (Button,), {'callback': callback})()
   ...: 

In [6]: button.callback()
World

Điều này thực hiện chính xác những gì Java đang làm, tuy nhiên nó làm rất rõ ràng hơn, và do đó, với một cú pháp cồng kềnh hơn. Trong thực tế trong Python, bạn có thể xác định các lớp địa phương:

In [7]: def function():
   ...:     class MyButton(Button):
   ...:         def callback(self):
   ...:             print('Hello, from a local class!')
   ...:     return MyButton()
   ...: 

In [8]: button = function()

In [9]: button.callback()
Hello, from a local class!

Sự khác biệt duy nhất liên quan đến Java là bạn phải đặt tên cho lớp và sử dụng nó để tạo một thể hiện. Sử dụng một người trang trí, bạn có thể tránh bước cuối cùng này:

def auto_instantiator(*args, **kwargs):
    def decorator(cls):
        return cls(*args, **kwargs)
    return decorator

Được dùng như:

In [2]: class Button:
   ...:     def callback(self):
   ...:         print('Button')
   ...:         

In [3]: @auto_instantiator()   # here args that should be passed to __init__
   ...: class button(Button):
   ...:     def callback(self):
   ...:         print('New Button')
   ...: # no need for button = button(...) 

In [4]: button.callback()    # button is an *instance* of the button class
New Button

Tuy nhiên, tùy thuộc vào cách bạn sẽ sử dụng phương pháp đó, tôi sẽ đề xuất hai cách khác nhau để xử lý vấn đề:

  1. Trên thực tế, tất cả các hành động của các nút đều giống nhau, ngoại trừ một số dữ liệu. Trong trường hợp này, có lẽ tốt hơn là chỉ tạo một thuộc tính thể hiện (hoặc thuộc tính) để giữ dữ liệu đó và thay đổi dữ liệu thay vì phương thức:

    Ý tôi là một cái gì đó như thế này:

    class Greeter:
        def __init__(self, name):
            self.name = name
        def greet(self):
            print('Hello, {.name}'.format(self))
    
  2. Bạn chỉ có thể đặt thuộc tính phiên bản cho cuộc gọi lại bạn muốn:

    button.callback = new_callback
    

As mentioned in the section Nested Classes, nested classes enable you to logically group classes that are only used in one place, increase the use of encapsulation, and create more readable and maintainable code. Local classes, anonymous classes, and lambda expressions also impart these advantages; however, they are intended to be used for more specific situations:

  • Local class: Use it if you need to create more than one instance of a class, access its constructor, or introduce a new, named type (because, for example, you need to invoke additional methods later).

  • Anonymous class: Use it if you need to declare fields or additional methods.

  • Lambda expression:

    • Use it if you are encapsulating a single unit of behavior that you want to pass to other code. For example, you would use a lambda expression if you want a certain action performed on each element of a collection, when a process is completed, or when a process encounters an error.

    • Use it if you need a simple instance of a functional interface and none of the preceding criteria apply (for example, you do not need a constructor, a named type, fields, or additional methods).

  • Nested class: Use it if your requirements are similar to those of a local class, you want to make the type more widely available, and you don't require access to local variables or method parameters.

    • Use a non-static nested class (or inner class) if you require access to an enclosing instance's non-public fields and methods. Use a static nested class if you don't require this access.

Trong lập trình, hẳn không ít lần bạn sử dụng lớp lồng nhau (Inner Class) để nhóm các lớp và các interface lại một nơi nhằm giúp cho việc code trở nên dễ đọc và bảo trì nhanh chóng hơn. Vậy lớp lồng nhau (Inner Class) là gì? Và có các kiểu lớp lồng nhau nào trong Java. 

  • Học lập trình web nên học ngôn ngữ nào có tính ứng dụng cao?
  • FUNiX ra mắt môn Lập trình hướng đối tượng bằng Java (version 3)
  • So sánh tính kế thừa và tính bao đóng trong lập trình hướng đối tượng (trong Java)
  • Cách xây dựng phương thức (method) trong Java
  • Cách sử dụng Package và Collection có sẵn trong Java

  • 1. Lớp lồng nhau (Inner Class) là gì?
  • 2. Các kiểu lớp lồng nhau trong Java
    • 2.1. Nested Inner Class
    • 2.2. Local Inner class
    • 2.3. Static Inner class
    • 2.4. Anonymous Inner class

>> Khóa học lập trình cơ bảnKhóa học lập trình cơ bản

>> Lập trình hướng đối tượng (bằng Java)Lập trình hướng đối tượng (bằng Java)

1. Lớp lồng nhau (Inner Class) là gì?

2. Các kiểu lớp lồng nhau trong Java

2.1. Nested Inner Class

Hướng dẫn anonymous inner class python - con trăn lớp bên trong ẩn danh
2.2. Local Inner class

2.3. Static Inner class

>> Khóa học lập trình cơ bản

    //code  

>> Lập trình hướng đối tượng (bằng Java)

        //code  

    }  

}  

Lớp lồng nhau (Inner Class) là một lớp được khai báo trong lớp hoặc interface khác. OuterClass.StaticNestedClass. 

Ngoài ra, bạn cũng có thể hiểu khái niệm này như sau: lớp bên trong là thành viên của lớp với thành viên là các biến và phương thức. Trong lớp lồng nhau, các lớp thành viên được gọi là lớp cấp cao nhất hoặc lớp ngoài. Một lớp cấp cao nhất có thể chứa bất kỳ số lượng các lớp bên trong.

Lớp lồng nhau trong Java

  • Cú pháp của inner class trong java: 

class Java_Outer_class{  

    class Java_Inner_class{  

2. Các kiểu lớp lồng nhau trong Java

2.1. Nested Inner Class

2.1. Nested Inner Class

2.2. Local Inner class

2.2. Local Inner class

2.3. Static Inner class

>> Khóa học lập trình cơ bản

Hướng dẫn anonymous inner class python - con trăn lớp bên trong ẩn danh
>> Lập trình hướng đối tượng (bằng Java)

2.3. Static Inner class

>> Khóa học lập trình cơ bản

Về mặt kỹ thuật, các lớp Static Inner không phải là một lớp lồng nhau trong Java. Tương tự như các thành viên tĩnh, một lớp lồng nhau tĩnh không thể truy cập các biến cá thể và phương thức của lớp bên ngoài.

2.4. Anonymous Inner class

Anonymous Inner class là lớp lồng nhau mang tính ẩn danh, có thể hiểu là  lớp bên trong được khai báo mà không có tên. Nhờ vậy, mà bạn có thể tạo mã ngắn gọn hơn. 

Nói chung, chúng được sử dụng khi có nhu cầu ghi đè phương thức của một lớp hoặc một giao diện. Ngoài ra, bạn cũng có thể sử dụng chúng nếu bạn chỉ cần sử dụng một lớp cục bộ một lần. Chúng tương tự như các lớp bên trong cục bộ nhưng không có tên.

Bài viết trên đây, FUNiX đã giới thiệu đến bạn các kiến thức về lớp lồng nhau (Inner Class) là gì? Các kiểu của lớp lồng nhau trong Java. Hy vọng, nội dung này sẽ mang lại hữu ích cho bạn. Đặc biệt, đừng quên tham khảo các khóa học lập trình tại funix.edu.vn để nhanh chóng trở thành một lập trình viên chuyên nghiệp nhé!FUNiX đã giới thiệu đến bạn các kiến thức về lớp lồng nhau (Inner Class) là gì? Các kiểu của lớp lồng nhau trong Java. Hy vọng, nội dung này sẽ mang lại hữu ích cho bạn. Đặc biệt, đừng quên tham khảo các khóa học lập trình tại funix.edu.vn để nhanh chóng trở thành một lập trình viên chuyên nghiệp nhé!

Phạm Thị Thanh Ngọc