SORU
23 Aralık 2008, Salı


Denklik destek için şık yolları ("eşitlik") Python derslerinde

Özel sınıflar yazarken çoğu zaman önemli == != operatörleri aracılığıyla denklik izin verilebilir. Python, bu mümkün __eq__ __ne__ özel yöntemleri uygulayarak, sırasıyla yapılır. Bunu yapmak için bulduğum en kolay yolu aşağıdaki yöntemi vardır:

class Foo:
    def __init__(self, item):
        self.item = item

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.__dict__ == other.__dict__
        else:
            return False

    def __ne__(self, other):
        return not self.__eq__(other)

Bunu yapmanın daha zarif demek biliyor musunuz? __dict__s karşılaştırarak, yukarıdaki yöntemi kullanarak, herhangi bir dezavantajları var mı?

Not: __eq__ __ne__ tanımsız zaman açıklama--biraz, bu davranış

>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
False

Yani a == b değerlendirir False çünkü gerçekten çalışır a is b bir testin kimlik (örneğin, "a aynı nesne olarak b?").

__eq__ __ne__ olarak tanımlanan bu davranış, peşinde olduğumuz))

>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
True

CEVAP
24 Aralık 2008, ÇARŞAMBA


Miras ile dikkatli olmak gerekir:

>>> class Foo:
    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.__dict__ == other.__dict__
        else:
            return False

>>> class Bar(Foo):pass

>>> b = Bar()
>>> f = Foo()
>>> f == b
True
>>> b == f
False

Türleri daha sıkı, bu gibi kontrol edin:

def __eq__(self, other):
    if type(other) is type(self):
        return self.__dict__ == other.__dict__
    return False

Bunun yanı sıra, yaklaşım iyi çalışır, bu özel yöntemleri vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • lane182videos

    lane182video

    6 EKİM 2011
  • Pocketnow

    Pocketnow

    14 EKİM 2007
  • pucksz

    pucksz

    24 Mart 2006