Mam ten kod dla obiektu. Ten obiekt jest ruchem, który możesz wykonać w grze z nożycami do papierów skalnych. Teraz obiekt musi być zarówno liczbą całkowitą (dla dopasowania protokołu), jak i ciągiem dla wygody pisania i przeglądania.Jak mogę utworzyć ten kod Pythonic
class Move:
def __init__(self, setMove):
self.numToName = {0:"rock", 1:"paper",2:"scissors"}
self.nameToNum = dict(reversed(pairing) for pairing in self.numToName.items())
if setMove in self.numToName.keys():
self.mMove=setMove
else:
self.mMove=self.nameToNum.get(setMove) #make it to a number
def defeats(self):
return Move((self.mMove-1)%3)
def losesTo(self):
return Move((self.mMove+1)%3)
def tiesWith(self):
return self
#Operator overloading
def __eq__(A,B):
return A.mMove==B.mMove
def __gt__(A,B):
return A.defeats(B)
def __lt__(A,B):
return A.losesTo(B)
def __ge__(A,B):
return A>B or A==B
def __le__(A,B):
return A<B or A==B
def __str__(self):
return self.numToName.get(self.mMove);
def __int__(self):
return self.mMove;
Teraz jestem trochę nowy dla Pythona, pochodzącego z tła C i Java. Wielką rzeczą w pytonie jest to, że istnieje tylko jeden prawidłowy sposób na zrobienie czegoś. Kolejna rzecz nie martwi się o typ. Jestem dość wyraźnie martwiąc się o typ tutaj.
Nie jestem więc pewien, jaki jest prawidłowy sposób obsługi tych obiektów. W tej chwili mam obiekt, który jest jednym z 3 typów (lub więcej, ale nie jestem pewien, co by to zrobiło). Może zamiast tego powinienem używać obiektów różnych klas? i sprawić, by stały się singletonami? Również mój obiekt jest obecnie modyfikowalny po utworzeniu, co jest złe w mojej głowie.
A więc ten kod Pythonic i jak mogę go bardziej elegancko? (Wydaje mi się, że jest to dobry przykład do użycia, aby pomóc mi ustalić, co sprawia, że dobry kod Pythona przepraszam, jeśli wydaje się nieco otwarty)
Jeśli chcesz understan d więcej o rzeczywisty problem/gry: http://progcomp.ucc.asn.au/FrontPage Ruchy to drobiazg, pomyślałem sobie po prostu losowo, że chciałbym stworzyć typ, jako lepszy sposób na ich repressent. –