2012-06-04 40 views
10

Tôi muốn tạo ra một lớp mà không đưa ra một Attribute Error theo yêu cầu của bất kỳ phương pháp mà có thể hoặc không thể tồn tại:Python: Cách chặn cuộc gọi phương thức không tồn tại?

lớp của tôi:

class magic_class: 
    ... 
    # How to over-ride method calls 
    ... 

Dự kiến ​​Output:

ob = magic_class() 
ob.unknown_method() 
# Prints 'unknown_method' was called 

ob.unknown_method2() 
# Prints 'unknown_method2' was called 

Hiện tại, unknown_methodunknown_method2 không thực sự tồn tại trong lớp học, nhưng cách thực hiện chúng ta chặn cuộc gọi phương thức trong python?

+0

thể trùng lặp của [phương pháp Intercept gọi bằng Python] (http://stackoverflow.com/questions/2704434/intercept -method-calls-in-python) – jamylak

+3

Lưu ý phụ FYI: PEP8 nói nó nên được đặt tên như 'class MagicClass:' và kiểu mới ít nhất phải thừa kế đối tượng có lẽ: 'class MagicClass (object):' – mVChr

Trả lời

26

Ghi đè phương pháp __getattr__() kỳ diệu:

class MagicClass(object): 
    def __getattr__(self, name): 
     def wrapper(*args, **kwargs): 
      print "'%s' was called" % name 
     return wrapper 

ob = MagicClass() 
ob.unknown_method() 
ob.unknown_method2() 

in

'unknown_method' was called 
'unknown_method2' was called 
+0

Làm thế nào điều này sẽ đối phó với một phương thức gọi như: 'ob.calc (1000, 2000)'. Có nghĩa là làm thế nào để bạn bảo tồn các args để gọi? –

+1

@YugalJindle: Đã thêm '* args, ** kwargs' để chấp nhận các thông số tùy ý trong trình bao bọc. –

Các vấn đề liên quan