Hướng dẫn can you pass a function to a class python? - bạn có thể chuyển một hàm cho một lớp python không?

Bạn cũng có thể sử dụng cú pháp

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
5 để gọi chức năng với danh sách đối số tùy ý:

class TimerTest:
    def __init__(self, interval, autoreset, fun, *args):
        # ...
        self.my_function = fun
        self.my_args = args
        # ...

    def run_timer(self):
        # ...
        def on_timed_event(s, e):
            # ...
            self.my_function(*self.my_args)
            # ...

Usage:

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)

Và kiểm tra hướng dẫn phong cách PEP8 là tốt. Các quy ước mã hóa ưa thích của Python khác với nhiều ngôn ngữ phổ biến khác.


Câu hỏi 1

Mỗi khi bạn sử dụng toán tử gán bổ sung (

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
6), bạn đang gắn một trình xử lý sự kiện mới vào sự kiện. Ví dụ: Mã này:

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()

Sẽ in

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
7Phrase hai lần.

Để biết thêm thông tin, bạn có thể kiểm tra tài liệu MSDN, đặc biệt đăng ký và hủy đăng ký khỏi các sự kiện.

Vì vậy, có lẽ bạn nên chuyển đăng ký sự kiện sang phương thức

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
8 và chỉ bắt đầu bộ hẹn giờ trong phương thức
>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
9 của bạn:

def run_timer(self):
     self.Timer.Start()

Bạn cũng có thể thêm một phương thức mới (hoặc sử dụng thuộc tính) để thay đổi khoảng thời gian:

def set_interval(self, interval):
     self.Timer.Interval = interval

Câu hỏi 2

Bạn nói đúng về

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
0: Đó là một đại biểu đại diện cho một phương thức được thực thi.

Ví dụ, hàm tạo

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
1 này:

public Timer(
    TimerCallback callback
)

đang mong đợi một hàm

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
2 với một tham số duy nhất loại
timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
3.

public delegate void TimerCallback(
    Object state
)

Khi bạn đang gọi một chức năng bằng cú pháp

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
5, bạn đang làm một cái gì đó hoàn toàn khác. Nó có thể dễ dàng hơn nếu tôi sẽ chỉ cho bạn một ví dụ:

def foo(a, b, *args):
    print a
    print b
    print args

>>> foo(1, 2, 3, 4, 5)
1
2
(3, 4, 5)

>>> args = (1, 2, 3)
>>> foo(1, 2, *args)
1
2
(1, 2, 3)

Về cơ bản trong trường hợp thứ hai, bạn đang gọi một chức năng với các đối số bổ sung được giải nén từ một tuple.

Vì vậy, nếu bạn muốn chuyển một chức năng có chữ ký khác cho hàm tạo, chấp nhận đại biểu

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
0, bạn phải tạo một chức năng mới, như @lasse đang đề xuất.

def my_func(state, a, b):
    pass

Bạn có thể làm điều này bằng cách sử dụng từ khóa Lambda:

t1 = Timer(lambda state: my_func(state, 1, 2))

hoặc bằng cách tuyên bố một chức năng mới:

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
0

Trong bài viết này, chúng ta sẽ học cách truyền một phương pháp như một đối số trong Python. Chúng tôi sẽ thảo luận về phương pháp khác nhau của các phương thức và chức năng truyền như các đối số bằng cách sử dụng mã tùy chỉnh.

Trong Python, mọi thứ như đối tượng, biến, vv đều được coi là một đối tượng. Do đó, các chức năng/phương pháp, quá được coi là đối tượng. Trong bài viết này, chúng tôi sẽ tuân thủ các phương pháp. Một phương thức có thể lấy nhiều đối số, như các đối tượng, biến (có cùng loại dữ liệu hoặc khác nhau) và thậm chí các phương thức khác vì các phương thức Python là các đối tượng hạng nhất. Các phương thức là các đối tượng có thể gọi được để bạn có thể vượt qua chúng, lưu trữ chúng và có thể làm bất cứ điều gì bạn muốn. ____ 26 Phương thức được liên kết với mọi phương thức và được gọi tự động khi bạn gọi phương thức có hoặc không có đối số. Bạn có thể nghĩ về một phương thức (hoặc hàm) như một biến có giá trị là đối tượng mã có thể gọi thực tế. Một phương thức do người dùng xác định hoặc một phương thức tích hợp cả hai đều có thể được truyền như một đối số cho một phương thức khác trong Python.first-class objects. Methods are callable objects so you can pass them, store them, and can do whatever you want to.

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
6 method is associated with every method and gets called automatically when you invoke the method with or without arguments. You can think about a method (or function) as a variable whose value is the actual callable code object. A user-defined method or a built-in method both can be passed as an argument to another method in python.

Note:

Trong bài viết này, chúng tôi sẽ sử dụng các phương thức trong các ví dụ sau, nhưng lưu ý rằng mọi thứ bên dưới đều áp dụng giống hệt với các hàm (trừ khi không có tham số

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
7). Các chức năng và phương thức Cả hai đều là các khối mã tiện ích, nhưng khi một hàm tiện ích được xác định bên trong một lớp, nó được gọi là phương thức. Don Tiết bị nhầm lẫn giữa các phương pháp và chức năng. Tất cả các chức năng trong Python có thể được truyền như một đối số cho một hàm khác.

Ví dụ: Một phương thức lớp được truyền như một đối số

Phương pháp được truyền như các đối số giống như một biến. Trong ví dụ này, chúng tôi xác định một lớp và các đối tượng của nó. Chúng tôi tạo một đối tượng để gọi các phương thức lớp. Bây giờ, để gọi một phương thức hoặc hàm được thông qua, bạn chỉ cần sử dụng tên mà nó bị ràng buộc giống như cách bạn sẽ sử dụng tên thông thường của phương thức (hoặc hàm).

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
8 Nếu bạn muốn chuyển một phương thức của một lớp làm đối số nhưng chưa có đối tượng mà bạn sẽ gọi nó, bạn chỉ cần chuyển đối tượng một khi bạn có nó làm đối số đầu tiên (tức là "tự " tranh luận).

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
1


Chào thế giới

Ví dụ: Các chức năng thứ tự cao hơn được thông qua như một đối số

Giống như các phương thức lớp được gọi là bằng cách sử dụng các đối tượng lớp và được truyền dưới dạng đối số, hàm do người dùng nói chung cũng có thể được truyền như một đối số cho một hàm khác vì các hàm là đối tượng. Các chức năng có thể chấp nhận một chức năng khác vì các đối số được gọi là các hàm bậc cao hơn. Trong ví dụ dưới đây, một hàm chức năng được tạo có chức năng như một đối số.func1 is created which takes a function as an argument.

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
2


Xin chào Thế giới Hello World
hello world

Ví dụ: Chức năng trình bao bọc được thông qua như một đối số

Trong Python, các hàm bao bọc hoặc bộ trang trí bao bọc một chức năng khác để mở rộng hành vi của chức năng được bọc, mà không cần sửa đổi vĩnh viễn nó. Trong các bộ trang trí, các chức năng được truyền như là đối số cho một hàm khác và sau đó chúng được gọi bên trong hàm trình bao bọc.

Ví dụ dưới đây xác định một trình trang trí đơn giản hello_decorator. Inside1 là một hàm trình bao bọc trong đó đối số được gọi. Hàm bên trong có thể truy cập các hàm cục bộ bên ngoài như trong trường hợp này func (). func () được gọi bên trong hàm trình bao bọc. hello_decorator. inner1 is a Wrapper function in which the argument is called. The inner function can access the outer local functions like in this case func(). func() is called inside the wrapper function.

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
3


Xin chào, đây là trước khi thực hiện chức năng Đây là bên trong hàm !! Đây là sau khi thực thi chức năng
This is inside the function !!
This is after function execution

Ví dụ: Lambda được thông qua như một đối số cho bản đồ ()

Ví dụ quan trọng nhất về các phương pháp truyền như đối số là Lambda. Bạn thường sử dụng

timer = Timer()

def on_timed_event(s, e):
    print "Hello form my event handler"

timer.Elapsed += on_timed_event
timer.Elapsed += on_timed_event

timer.Start()
9 và
def run_timer(self):
     self.Timer.Start()
0 cùng nhau để thực hiện các hoạt động danh sách khác nhau và nhiều hoạt động khác trong Python. Trong Python, một biểu thức Lambda là một cú pháp đặc biệt để tạo chức năng ẩn danh. Khi bạn đánh giá biểu thức Lambda, đối tượng bạn nhận được lại được gọi là hàm Lambda. Các chức năng Lambda giống như các chức năng Python thông thường, với một vài cảnh báo.lambda expression the object you get back is called a lambda function. Lambda functions are just like regular Python functions, with a few caveats.

Python thực hiện hàm map () trong đó tham số đầu tiên là hàm và thứ hai là có thể sử dụng được. Trong ví dụ này, cuộc gọi hàm truyền hàm SQR (x) như một đối số hàm bằng phương thức bản đồ. Một cách khác để sử dụng phương thức bản đồ () là chuyển Lambda như một đối số với Itable.sqr(x) as a function argument using the map method. Another way to use the map() method is to pass lambda as an argument with iterable.

>>> t1 = TimerTest(1000, True, fun1, 10, 20)
>>> t2 = TimerTest(1000, True, fun2)
4


[1, 9, 25, 49, 81]

Sự kết luận

Trong bài viết này, chúng tôi đã học cách truyền một phương pháp và chức năng như là đối số cho một hàm khác. Mỗi ví dụ đều có phương pháp riêng của nó. Biểu thức Lambda như một đối số cho phương thức MAP () là ví dụ tốt nhất để hiểu bài viết này bởi vì bạn đã sử dụng chúng cùng nhau nhiều lần. Hãy thử chuyển các chức năng khác nhau như các đối số cho các chức năng khác và quan sát hành vi.

Bạn có thể chuyển một chức năng vào một python lớp?

Các chức năng có thể được thông qua trong Python.Trong thực tế, có những chức năng được xây dựng thành Python mong đợi các chức năng được đưa ra như một hoặc nhiều đối số của chúng để sau đó họ có thể gọi chúng sau.. In fact there are functions built into Python that expect functions to be given as one or more of their arguments so that they can then call them later.

Bạn có thể chuyển một lớp cho một chức năng?

Có của thô, bạn có thể vượt qua các lớp hoặc chức năng hoặc thậm chí các mô -đun ... def foo (): Truyền ở đây nó cung cấp địa chỉ cho Ex. ... def foo(): pass here it gives it address for ex.

Chúng ta có thể chuyển các đối số cho lớp học trong Python không?

Một hàm có thể lấy nhiều đối số, các đối số này có thể là đối tượng, biến (có cùng loại dữ liệu hoặc khác nhau) và các hàm.Các hàm Python là đối tượng hạng nhất.Trong ví dụ dưới đây, một hàm được gán cho một biến., these arguments can be objects, variables(of same or different data types) and functions. Python functions are first class objects. In the example below, a function is assigned to a variable.

Chúng ta có thể vượt qua lớp dưới dạng đối số chức năng không?

Chuyển và trả về các đối tượng trong C ++ trong C ++, chúng ta có thể chuyển các đối tượng của lớp dưới dạng đối số và cũng trả về chúng từ một hàm giống như cách chúng ta vượt qua và trả về các biến khác.we can pass class's objects as arguments and also return them from a function the same way we pass and return other variables.