سؤال

ما هي الطريقة الصحيحة للحلاقة على أساليب كائن بيثون واتصل بها؟

بالنظر إلى الكائن:

class SomeTest():
  def something1(self):
    print "something 1"
  def something2(self):
    print "something 2"

لا يوجد حل صحيح

نصائح أخرى

يمكنك استخدام الوحدة النمطية للتفتيش للحصول على أعضاء الفصل (أو مثيل):

>>> class C(object):
...     a = 'blah'
...     def b(self):
...             pass
... 
...
>>> c = C()
>>> inspect.getmembers(c, inspect.ismethod)
[('b', <bound method C.b of <__main__.C object at 0x100498250>>)]

إرجاع get sembers () قائمة من tuples، حيث يكون كل tuple (الاسم، العضو). الحجة الثانية للحصول على get semembers () هي المسند، والذي يقوم بمرشفي قائمة العودة (في هذه الحالة، وعودة كائنات الطريقة فقط)

الأساليب مقابل الوظائف وأنواع أخرى من Callables ...

(لمعالجة هذه القضية في التعليقات في وظيفة غير معروفة.)

أولا، تجدر الإشارة إلى أنه بالإضافة إلى الأساليب المعرفة من قبل المستخدم، هناك طرق مدمجة، وسيلة مدمجة هي، كما Doc في http://docs.python.org/Reference/Datamodel.html. يقول، "حقا تمويه مختلف من وظيفة مدمجة" (وهو مجمع حول وظيفة ج.)

بالنسبة للطرائق المحددة من قبل المستخدم، كما يقول اقتباس معروف:

يجمع كائن طريقة محددة من قبل المستخدم بين فئة أو مثيل فئة (أو لا شيء) وأي كائن قابل للاستدعاء (عادة وظيفة محددة من قبل المستخدم).

ولكن هذا لا يعني أن "أي شيء يحدد __call__ ويعلق على كائن هو طريقة. "الطريقة هي قابلية للاستدعاء، ولكن الاستعداد ليس بالضرورة طريقة. الأساليب المعرفة من قبل المستخدم هي الأغلفة حول ما يقوله الاقتباس.

نأمل أن هذا الإخراج (من بيثون 2.5.2 الذي لدي مفيد) سيظهر التمييز:

IDLE 1.2.2      
>>> class A(object):
    x = 7


>>> A  # show the class object
<class '__main__.A'>
>>> a = A()
>>> a  # show the instance
<__main__.A object at 0x021AFBF0>
>>> def test_func(self):
    print self.x


>>> type(test_func)  # what type is it?
<type 'function'>
>>> dir(test_func)  # what does it have?
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__',
 '__getattribute__', '__hash__', '__init__', '__module__', '__name__',
 '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict',
 'func_doc', 'func_globals', 'func_name']
>>> # But now let's put test_func on the class...
>>> A.test = test_func
>>> type(A.test)  # What type does this show?
<type 'instancemethod'>
>>> dir(A.test)  # And what does it have?
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__get__',
 '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__',
 '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'im_class',
 'im_func', 'im_self']
>>> # See, we just got a wrapper, and the function is in 'im_func'...
>>> getattr(A.test, 'im_func')
<function test_func at 0x0219F4B0>
>>> # Now to show bound vs. unbound methods...
>>> getattr(a.test, 'im_self') # Accessing it via the instance
<__main__.A object at 0x021AFBF0>
>>> # The instance is itself 'im_self'
>>> a.test()
7
>>> getattr(A.test, 'im_self') # Accessing it via the class returns None...
>>> print getattr(A.test, 'im_self')
None
>>> # It's unbound when accessed that way, so there's no instance in there
>>> # Which is why the following fails...
>>> A.test()

Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    A.test()
TypeError: unbound method test_func() must be called with A instance as
first argument (got nothing instead)
>>>

- التحرير لإضافة الإخراج الإضافي التالي، والذي هو أيضا ذات صلة ...

>>> class B(object):
    pass

>>> b = B()
>>> b.test = test_func  # Putting the function on the instance, not class
>>> type(b.test)
<type 'function'>
>>> 

لن أضيف المزيد من الإخراج، ولكن يمكنك أيضا إنشاء سمة فئة لفئة أو مثيل آخر، وعلى الرغم من أن الفصول تكون قابلة للاستدعاء، فلن تحصل على طريقة. يتم تنفيذ الأساليب باستخدام واصفات غير البيانات، لذا ابحث عن الواصفات إذا كنت تريد المزيد من المعلومات حول كيفية عملها.

سيتصل Snippet الكود هذا بأي شيء سيجده obj وتخزين النتائج في رسم الخرائط، حيث اسم مفتاح السمة - dict((k, v()) for (k, v) in obj.__dict__.iteritems() if k.startswith('something'))

يحرر

دانيال، أنت مخطئ.

http://docs.python.org/Reference/Datamodel.html.

طرق محددة من قبل المستخدم

محدد المستخدم طريقة هدف يجمع بين الفصل، مثيل فئة (أو لا شيء) و أي كائن قابل للاستدعاء (عادة وظيفة محددة من قبل المستخدم).

لذلك، فإن أي شيء يحدد __call__ ويعلق على كائن هو طريقة.

إجابه

الطريقة الصحيحة لمعرفة العناصر التي لها كائن لها استخدام دالة Dir ().

من الواضح أن هذا المثال يعمل فقط من أجل الوظائف التي لا تأخذ أي حجج.

a=SomeTest()
for varname in dir(a):
    var = getattr(a, varname)
    if hasattr(var, "__call__"):
        var()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top