2012-03-23 16 views
7

Chciałbym, aby móc dodać do klasy niestandardowego w stylu:Dodaj do niestandardowej klasy w Pythonie

x=myclass("Something", 7) 
x + 3 

7, oczywiście, odpowiada wewnętrznej własności, że chciałbym, aby zwiększyć przez dodanie do niego.

Klasa zawiera numer odnoszący się do lokalizacji na liście. To może wydawać się czymś, co można zrobić zwykłą liczbą całkowitą, ale potrzebuję go, aby działał jako osobny typ. Wszystko to ma na celu naśladowanie starego języka gry. Klasa jest jej klasą "zmienną", a wartość zmiennej jest przechowywana na wyżej wymienionej liście. Najwyraźniej w starszych wersjach gry tablice zostały sfałszowane przez wykonanie matematyki na instancji zmiennej obiektu, aby pobrać inną zmienną. Próbuję to naśladować.

+0

Klasa posiada numer, który odnosi się do lokalizacji na liście. To może wydawać się czymś, co można zrobić zwykłą liczbą całkowitą, ale potrzebuję go, aby działał jako osobny typ. Wszystko to ma na celu naśladowanie starego języka gry. Klasa jest jej klasą "zmienną", a wartość zmiennej jest przechowywana na wyżej wymienionej liście. Najwyraźniej w starszych wersjach gry tablice zostały sfałszowane przez wykonanie matematyki na instancji zmiennej obiektu, aby pobrać inną zmienną. Próbuję więc emulować to @. @ – Kelketek

+0

Nadal nie jestem pewien, jakie są wymagania, ale z tego komentarza najłatwiej jest wykluczyć z 'int'. –

+0

@Kelketek: Przesunąłem twój komentarz na pytanie, do którego należy. –

Odpowiedz

9

Jeśli chcesz wesprzeć dodawanie do instancji klasy, musisz zdefiniować metodę __add__() na swojej klasie:

class MyClass(object): 
    def __init__(self, x): 
     self.x = x 
    def __add__(self, other): 
     return self.x + other 

Przykład:

>>> a = MyClass(7) 
>>> a + 3 
10 

Aby również wspierać 3 + a zdefiniować metodę __radd__() .

Jeśli chcesz, aby móc zaktualizować atrybut MyClass przypadkach x użyciu

a += 3 

można zdefiniować __iadd__().

Jeśli chcesz, aby wystąpienia klas zachowywały się jak liczby całkowite z dodatkowymi metodami i atrybutami, powinieneś po prostu wypróbować z int.

+0

To działa. Nie chcę całej funkcjonalności int. Na przykład nie chcę, aby radd działał w tej sprawie. Czy istnieje lista funkcji, które pokażą mi, co mogę zaimplementować? Czy po prostu muszę dodać metody z klasy int z mojej klasy dla tych, które chcę wspierać? – Kelketek

+0

@Kelketek: Wystarczy postępować zgodnie z dowolnym z linków we wpisie, aby uzyskać dalsze magiczne metody. Nie rozumiem twojego drugiego pytania. –

+1

Uwielbiam Python ze względu na takie funkcje. Możesz prawie zrobić cokolwiek w Pythonie. – beary605

0

To, czego szukasz, to przeciążanie operatora. Można to zrobić w Pythonie nowych klas stylu przeciążenia metody __add__ tak:

>>> class Test(object): 
...  def __init__(self): self.prop = 3 
...  def __add__(self, x): 
...   return self.prop + x 
... 
>>> Test() + 4 
7 
>>> 
+0

Przeglądając to, co napisałem, prawdopodobnie nie powinienem modyfikować właściwości 'prop' podczas dodawania. Whoops. –

Powiązane problemy