2014-09-25 15 views
5

Nói rằng tôi có một lớp học với một loạt các phương pháp:Python: Làm điều gì đó cho bất kỳ phương pháp nào của một lớp học?

class Human(): 

    def eat(): 
    print("eating") 

    def sleep(): 
    print("sleeping") 

    def throne(): 
    print("on the throne") 

Sau đó, tôi chạy tất cả các phương pháp với

John=Human() 
John.eat() 
John.sleep() 
John.throne() 

Tôi muốn chạy print("I am") cho mỗi phương pháp được gọi. Vì vậy, tôi sẽ nhận được một cái gì đó như

I am: 
eating 
I am: 
sleeping 
I am: 
on the throne 

Có cách nào để thực hiện việc này mà không phải định dạng lại từng phương pháp không?

+7

Sử dụng trang trí, áp dụng nó cho tất cả phương pháp: [Đính kèm một trang trí cho tất cả các chức năng trong một lớp] (http://stackoverflow.com/q/3467526) và [Viết một trang trí lớp áp dụng một trang trí cho tất cả các phương pháp] (http://stackoverflow.com/q/6695854) –

+0

Nếu bạn đang cố gắng giảm thiểu số lần chỉnh sửa bạn cần thực hiện, điều đơn giản nhất cần làm là chỉ thay đổi định nghĩa của từng phương pháp. Nếu bạn đang tìm kiếm một cách để cô lập sự thay đổi ở một nơi duy nhất, để áp dụng cho bất kỳ phương pháp hiện tại hoặc tương lai nào, trang trí là cách để đi. – chepner

+0

Tại sao không có chức năng 'def do (self, action)', sau đó 'eat' chỉ trở thành' self.do ("eating") 'và bất kỳ thay đổi nào khác cho đầu ra xảy ra ở một nơi. – jonrsharpe

Trả lời

5

Nếu bạn không thể thay đổi cách bạn gọi các phương thức của bạn, bạn có thể sử dụng __getattribute__ magic method bạn (phương pháp được các thuộc tính quá nhớ!) chỉ phải cẩn thận để kiểm tra các loại thuộc tính, do đó bạn không in "tôi:" mỗi khi bạn muốn truy cập vào bất kỳ chích hoặc int thuộc tính bạn có thể có:

import types 

class Human(object): 
    def __getattribute__(self, attr): 
     method = object.__getattribute__(self, attr) 
     if not method: 
      raise Exception("Method %s not implemented" % attr) 
     if type(method) == types.MethodType: 
      print "I am:" 
     return method 

    def eat(self): 
     print "eating" 

    def sleep(self): 
     print "sleeping" 

    def throne(self): 
     print "on the throne" 

John = Human() 
John.eat() 
John.sleep() 
John.throne() 

Đầu ra:

I am: 
eating 
I am: 
sleeping 
I am: 
on the throne 
-3

Bạn có thể viết một phương thức khác như def iam() và viết mã theo phương thức print "i am \n" và gọi trước mọi phương thức.

2

Bạn có thể thực hiện việc này nếu bạn không nhớ thêm phương thức __init____call__ vào lớp học và self vào đối số của phương pháp.

class Human(): 
    def __init__(self): 
     return None 
    def __call__(self, act): 
     print "I am:" 
     method = getattr(self, act) 
     if not method: 
      raise Exception("Method %s not implemented" % method_name) 
     method() 

    def eat(self): 
     print "eating" 

    def sleep(self): 
     print "sleeping" 

    def throne(self): 
     print "on the throne" 

John = Human() 
John("eat") 
John("sleep") 
John("throne") 

EDIT: xem câu trả lời khác của tôi cho một giải pháp tốt hơn

+0

Cảm ơn nhưng giải pháp đó thay đổi cú pháp của cách tôi gọi các phương thức .. – Pithikos

+0

@Pithikos thấy câu trả lời khác của tôi cho giải pháp không yêu cầu bạn thay đổi cách bạn gọi phương pháp của mình – nettux443

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