2015-05-18 6 views
15

खोज का एक बहुत बाद, मैंने पाया है वहाँ एक मौजूदा उदाहरण के लिए एक समयबद्ध विधि या अनबाउंड वर्ग विधियों को जोड़ने के लिए कुछ तरीके वस्तुओं रहे हैं किपायथन में किसी मौजूदा ऑब्जेक्ट में कोई विधि जोड़ने का कोई शानदार तरीका?

इस तरह के तरीके दृष्टिकोण नीचे कोड ले जा रहा है शामिल हैं।

import types 


class A(object): 
    pass 


def instance_func(self): 
    print 'hi' 

def class_func(self): 
    print 'hi' 

a = A() 

# add bound methods to an instance using type.MethodType 
a.instance_func = types.MethodType(instance_func, a)    # using attribute 
a.__dict__['instance_func'] = types.MethodType(instance_func, a) # using __dict__ 

# add bound methods to an class 
A.instance_func = instance_func 
A.__dict__['instance_func'] = instance_func 

# add class methods to an class 
A.class_func = classmethod(class_func) 
A.__dict__['class_func'] = classmethod(class_func) 

क्या मुझे परेशान करता है समारोह का नाम, instance_func या class_func दो बार टाइपिंग, है।

क्या फ़ंक्शन का नाम टाइप किए बिना किसी मौजूदा फ़ंक्शन को किसी वर्ग या इंस्टेंस में जोड़ने का कोई आसान तरीका है?

उदाहरण के लिए, A.add_function_as_bound_method(f) दूर बहुत सुरुचिपूर्ण तरीका समारोह पहले से ही __name__ विशेषता है के बाद से एक उदाहरण या वर्ग के लिए एक मौजूदा समारोह को जोड़ने के लिए किया जाएगा।

उत्तर

43

आम तौर पर, ऑब्जेक्ट डिक्शनरी में संग्रहीत फ़ंक्शंस स्वचालित रूप से बाध्यकारी पहुंच में नहीं आते हैं जब आप उन्हें बिंदीदार पहुंच के साथ देखते हैं।

कहा कि, आप functools.partial का उपयोग समारोह पूर्व बाँध और वस्तु शब्दकोश में संग्रहीत कर सकते हैं तो यह एक विधि की तरह पहुँचा जा सकता है:

>>> from functools import partial 
>>> class Dog: 
     def __init__(self, name): 
      self.name = name 


>>> d = Dog('Fido') 
>>> e = Dog('Buddy') 
>>> def bark(self):     # normal function 
     print('Woof! %s is barking' % self.name) 

>>> e.bark = partial(bark, e)  # pre-bound and stored in the instance 
>>> e.bark()      # access like a normal method 
Woof! Buddy is barking 

यह एक विधि को जोड़ने के लिए कुछ हद तक एक सुंदर तरीका है किसी मौजूदा ऑब्जेक्ट (इसके वर्ग को बदलने और अन्य मौजूदा वस्तुओं को प्रभावित किए बिना) की आवश्यकता के बिना।

फ़ॉलो-अप टिप्पणी करने के लिए:

>>> add_method(e, bark) 
>>> e.bark() 
Woof! Fido is barking 
:

>>> def add_method(obj, func): 
     'Bind a function and store it in an object' 
     setattr(obj, func.__name__, partial(func, obj)) 

इस तरह यह प्रयोग करें:

आप पूर्व बाध्य समारोह को जोड़ने के लिए एक सहायक समारोह का उपयोग कर सकते एक भी कदम है

आशा है कि यह वही है जो आपको चाहिए :-)

संबंधित मुद्दे

 संबंधित मुद्दे