Katakanlah saya memiliki kelas ini:

class Test(object):
    def __init__(self, a):
        self.a = a

    def test(self, b):
        if isinstance(self, Test):
            return self.a + b
        else:
            return self + b

Ini idealnya di dunia saya melakukan ini:

>>> Test.test(1,2)
3
>>> Test(1).test(2)
3

Sekarang ini tidak berfungsi karena Anda mendapatkan kesalahan ini:

TypeError: unbound method test() must be called with Test instance as first argument (got int instance instead)

Di python3 ini berfungsi dengan baik, dan saya curiga ini mungkin dengan dekorator di python2 tetapi python foo saya tidak cukup kuat untuk membuatnya berfungsi.

Plot Twist: Jadi apa yang terjadi ketika saya membutuhkan sesuatu untuk diri sendiri ketika tidak dipanggil secara statis.

0
albertjan 23 November 2017, 01:23

1 menjawab

Jawaban Terbaik

Jika Anda menginginkan sesuatu yang benar-benar akan menerima self jika dipanggil pada sebuah instance, tetapi juga dapat dipanggil di kelas, menulis jenis deskriptor Anda sendiri mungkin disarankan:

import types

class ClassOrInstanceMethod(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped
    def __get__(self, instance, owner):
        if instance is None:
            instance = owner
        return self.wrapped.__get__(instance, owner)

class demo(object):
    @ClassOrInstanceMethod
    def foo(self):
        # self will be the class if this is called on the class
        print(self)

Demo.

Untuk versi asli pertanyaan Anda, Anda bisa menulisnya seperti metode statis lainnya, dengan @staticmethod. Memanggil metode statis pada instance berfungsi sama seperti memanggilnya di kelas:

class Test(object):
    @staticmethod
    def test(a, b):
        return a + b

Demo.

5
5 revs 28 Maret 2018, 22:36