Hướng dẫn can you put a function in a class python? - bạn có thể đặt một hàm trong lớp python không?

Trước hết, lập trình hướng đối tượng không chỉ là đặt các hàm lại với nhau trong một lớp. Một đối tượng nên đại diện cho một thực thể (thực hoặc ảo), cung cấp tất cả các hành vi liên quan đến nó, đóng gói các triển khai nội bộ của nó.

Thứ hai, tên phương thức (hoặc tên hàm cho vấn đề đó) phải là động từ không phải là một danh từ, trong khi lớp (đại diện cho một thực thể nên là danh từ).

Thứ ba, đây là một ví dụ về hành vi đa hình

Một triển khai đơn giản (ngây thơ) có thể trông như thế này -

class Fruit(object):
      """ An abstract class"""

      func = None

      def process(self, arguments):
          with mp.Pool(processes=8) as pool:
               pool.map(self.func, arguments)

class Apple(Fruit):

      func = func1

class Banana(Fruit):

      func = func2

class Orange(Fruit):

      func = func3

class FruitPie(object):

      def __init__(self, fruits):
          self.fruits = fruits

      def process(self, arguments):
          for fruit in self.fruits:
              fruit.process(arguments)

if __name__ == '__main__':
     pie = FruitPie(Apple(), Banana(), Orange())
     pie.process()

Nó không phải là một thiết kế hoàn hảo, có thể có rất nhiều cải tiến tùy thuộc vào các yêu cầu của lớp mà tôi không nhận thức đầy đủ. Nhưng một cái gì đó trên những dòng này.

Thêm phương thức vào các lớp Python

Hướng dẫn can you put a function in a class python? - bạn có thể đặt một hàm trong lớp python không?

Cách bình thường để thêm chức năng (phương thức) vào một lớp trong Python là xác định các chức năng trong cơ thể lớp. Có nhiều cách khác để thực hiện điều này có thể hữu ích trong các tình huống khác nhau.

Đây là cách truyền thống

class A(object):
    def print_classname(self):
        print self.__class__.__name__

Phương pháp cũng có thể được xác định bên ngoài phạm vi của lớp. Điều này cho phép chức năng của print_ classname được sử dụng như một hàm độc lập và như một phương pháp của lớp.

def print_classname(a):
    print a.__class__.__name__

class A(object):
    print_classname = print_classname

Hoặc, tương đương

def print_classname(a):
    print a.__class__.__name__

class A(object):
    pass

setattr(A, "print_classname", print_classname)

Thêm phương thức vào một đối tượng của loại A A cũng có thể. Tuy nhiên, bạn cần chỉ định rằng thuộc tính của print_ classname của đối tượng là một phương thức để đảm bảo rằng nó sẽ nhận được một tham chiếu đến bản thân là tham số đầu tiên ngầm khi nó được gọi.

from types import MethodType

def print_classname(a):
    print a.__class__.__name__

class A(object):
    pass

# this assigns the method to the instance a, but not to the class definition
a = A()
a.print_classname = MethodType(print_classname, a, A)

# this assigns the method to the class definition
A.print_classname = MethodType(print_classname, None, A)

Các phương thức cụ thể từ một lớp khác cũng có thể được thêm vào (mà không kế thừa mọi thứ khác) bằng cách thêm hàm cơ bản của phương thức. Nếu không, phương thức sẽ mong đợi một tham chiếu đến một thể hiện của lớp gốc là tham số đầu tiên ngầm.

class B(object):
    def print_classname(self):
        print self.__class__.__name__

# option 1
class A(object):
    print_classname = B.print_classname.__func__

# option 2
class A(object):
    pass

setattr(A, "print_classname", B.print_classname.__func__)

Để lại một phản hồi

  • Ngày 25 tháng 11 năm 2020 |

Các lớp có thể được tạo ra chỉ đơn giản là một tập hợp các chức năng. Các chức năng có thể được xác định trong lớp chính xác giống như cách các hàm thường được tạo. Để gọi các chức năng này, chúng ta cần gọi nó từ lớp. Vì vậy, lớp ví dụ được gọi là lời chào bên dưới lấy tên và trả lại lời chào cho người gọi lớp. & Nbsp;

class Greetings:
    def good_morning(name):
        print(f'Good morning {name}')
        
    def good_afternoon(name):
        print(f'Good afternoon {name}')
        
    def good_evening(name):
        print(f'Good evening {name}')
        
        
Greetings.good_afternoon('John')
Greetings.good_morning('Peter')
Greetings.good_evening('Jane') 

Out:
Good afternoon John
Good morning Peter
Good evening Jane

Sai lầm phổ biến & nbsp;

Mặc dù các lớp trên hành xử như chúng ta mong đợi. Hãy tham gia cùng một lớp và thêm __init__. Xem & nbsp; Bài viết này & nbsp; nếu bạn không biết __init__ là gì.

class Greetings:
    
    def __init__(self):
        pass
    
    def good_morning(name):
        print(f'Good morning {name}')
        
    def good_afternoon(name):
        print(f'Good afternoon {name}')
        
    def good_evening(name):
        print(f'Good evening {name}')
        
        
g = Greetings()

Chúng tôi đã tạo ra một thể hiện của lớp lời chào có tên g. Nếu chúng tôi cố gắng gọi các chức năng, chúng tôi đã xác định trong lớp như sau:

g.good_afternoon('John')
class A(object):
    def print_classname(self):
        print self.__class__.__name__
0

Nó có thể không rõ ràng ngay tại sao điều này xảy ra. TypeError & nbsp; Được trả về ở trên cho thấy rằng chúng tôi đã chuyển 2 đối số cho hàm, khi có vẻ như chúng tôi chỉ vượt qua một đối số. Hãy thử gọi nó mà không có tên để xem điều gì sẽ xảy ra:

class A(object):
    def print_classname(self):
        print self.__class__.__name__
1

Chuyện gì đang xảy ra ở đây?

Khi chúng ta tạo một thể hiện của một lớp, đối số đầu tiên được truyền cho hàm là chính phiên bản. Vì vậy, lý do chúng tôi nhận được kiểu mẫu là cách mà Python đang đọc chức năng G.Good_Ninteroon ('John') Trong phần tiếp theo tại sao điều này xảy ra. & NBSP;g.good_afternoon('John') function is g.good_afternoon(g, 'John')  although this may seem confusing, it will become clear in the next section why this happens. 

Phương pháp thể hiện

Lấy một lớp ví dụ mới có tên là Student, có tên, tên cuối cùng, tuổi và chuyên ngành. & NBSP;

class A(object):
    def print_classname(self):
        print self.__class__.__name__
2
class A(object):
    def print_classname(self):
        print self.__class__.__name__
3

Khi tạo các phương thức thể hiện, chúng ta phải vượt qua & nbsp; self & nbsp; từ khóa, điều này sẽ giải quyết vấn đề của trường hợp được truyền đến các chức năng như đối số đầu tiên. Chúng ta hãy xây dựng trên lớp hiện tại và thêm chức năng đăng ký để hiển thị khả năng của các phương thức thể hiện tương tác với các thuộc tính.

class A(object):
    def print_classname(self):
        print self.__class__.__name__
4

Tất cả các phương thức trên đã bị ràng buộc với thể hiện (chúng tôi đặt tên cho phiên bản này & nbsp;s), we can check this by using the dir keyword on the instance to see all the attributes and methods bound to s.

class A(object):
    def print_classname(self):
        print self.__class__.__name__
5
class A(object):
    def print_classname(self):
        print self.__class__.__name__
6

Chúng ta có thể thêm một hỗn hợp các hàm ràng buộc cá thể và các hàm bình thường như được định nghĩa ở đầu tài liệu. Dưới đây chúng tôi thêm một phương pháp in năm học hiện tại. & NBSP;

class A(object):
    def print_classname(self):
        print self.__class__.__name__
7

Tuy nhiên, chúng tôi vẫn sẽ gặp lỗi nếu chúng tôi cố gắng gọi chức năng mới này từ một ví dụ, vì chúng tôi đã thiết lập rằng các phương thức/ chức năng gọi từ một thể hiện luôn truyền cho chính nó trong đó là đối số đầu tiên. Vì vậy, nếu chúng tôi muốn gọi chức năng năm học này, chúng tôi có thể làm như vậy như sau:

class A(object):
    def print_classname(self):
        print self.__class__.__name__
8

Một cách tốt hơn để xử lý điều này sẽ là chủ đề của bài viết tiếp theo về phương thức lớp & tĩnh.

Bản tóm tắt

- Khi gọi một hàm từ lớp, cú pháp là className.functionName () & nbsp;ClassName.FunctionName() 

- Khi gọi một hàm bị ràng buộc vào một thể hiện của một lớp, đối số đầu tiên được chuyển vào hàm là chính trường hợp. Chúng được gọi là & nbsp;methods

- Để truy cập và gọi một phương thức một cách chính xác, chúng ta nên vượt qua & nbsp; self & nbsp; trong là đối số đầu tiên khi viết mã cho phương thức. & Nbsp;

- Các phương thức này cho phép chúng ta tương tác với các thuộc tính được liên kết với phiên bản / lớp. & NBSP;

Bạn có thể đặt các chức năng trong một python lớp không?

Các lớp có thể được tạo ra chỉ đơn giản là một tập hợp các chức năng.Các chức năng có thể được xác định trong lớp chính xác giống như cách các hàm thường được tạo.Để gọi các chức năng này, chúng ta cần gọi nó từ lớp.. The functions can be defined within the class exactly the same way that functions are normally created. In order to call these functions we need to call it from the class.

Bạn có thể có một chức năng bên trong một lớp?

Các chức năng được liên kết với một lớp được gọi là chức năng thành viên của lớp đó.Các hàm thành viên phải được khai báo bên trong lớp nhưng chúng có thể được xác định bên trong lớp hoặc bên ngoài lớp.Member functions must be declared inside the class but they can be defined either inside the class or outside the class.