Python - Beräkna egenskaper hos en fyrhörning givet ett urval av dem
Hej!
Stor varning för okunnighet nedanför denna rad, du är varnad.
Jag går en kurs i python och tänker inte be er göra min uppgift åt mig, snarare skulle jag vilja ha någon slags direktiv om vad det egentligen är jag letar efter.
Min ambition är att jobba med olika geometriska figurer och givet några aspekter av dem kunna beräkna de övriga. Som en del av detta tänkte jag också försöka lära mig något om grunderna i hur klasser fungerar men det är sekundärt och inte ett krav på något sätt.
Mitt, egenskapade, problem är enligt nedan och är något jag önskar lösa för mitt avslutningsprojekt. Detta är alltså inte projektet i sin helhet utan ska sedan kopplas ihop med andra saker. Kan jag få ihop det ska jag sedan göra liknande saker för trianglar och cirklar också.
En fyrhörning har följande fyra egenskaper:
längd
bredd
area
omkrets
Givet någon/några av dessa, beräkna de övriga när så är möjligt. Jag började med att knappa ihop följande, vilket är mitt första försök någonsin på att använda klasser så tänk inte att jag kan/förstår allt.
class square:
def __init__(self, l, w):
self.length = l
self.width = w
def area(self):
return self.length * self.width
def circumference(self):
return 2*(self.length + self.width)
så långt fungerar det fin-fint och om jag för in l, w får jag de önskade resultaten.
Problemet är nu att jag också skulle vilja kunna föra in t.ex. w, och area och sedan beräkna exempelvis l. Mitt försök var då enligt nedan:
class square:
def __init__(self, l=None, w=None, A=None): #They need to be something or a missing argument error is thrown
self.length = l
self.width = w
self.area = A
def area(self):
return self.length * self.width
def circumference(self):
return 2*(self.length + self.width)
def length(self):
return self.area / self.width
och i terminalen körde jag enligt nedan och får en traceback.
>>> my_square = square()
>>> my_square.width = 5
>>> my_square.area = 30
>>> my_square.length()
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
my_square.length()
TypeError: 'NoneType' object is not callable
>>> my_square.length = my_square.length()
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
my_square.length = my_square.length()
TypeError: 'NoneType' object is not callable
Min tanke var att det skulle vara skillnad på my_square.length() och my_square.length på något sätt men så verkar det inte vara. Sätter jag alla egenskaper till 0 istället får jag samma sak men int istället för None.
Jag har testat att söka runt lite och funderar nu på om det är function overloading jag är ute efter men det verkar mest beröra om jag t.ex. vill att något standardanrop som str() ska göra något speciellt i min klass fall?
Behöver jag lägga en if-logik i __init__ som tittar över vad jag får in och sedan agerar på det? Isåfall är det kanske väldigt onödigt att ha en klass över huvudtaget och jag borde bara köra en stor funktion som klurar ut en bunt variabler åt mig?
Vilken sorts sökord kan relatera till mitt problem? Har ni tips på relevanta StackOverflow frågor? Är jag ute på djupt vatten och borde testa mig på någon annan sorts lösning? Alla tankar är varmt välkomna
EDIT: Kom på att jag inte ska bumpa min egen tråd... Här är ett svar jag skrev av misstag nedanför:
Som vanligt kommer man fort framåt ibland...
class square:
def __init__(self, l=None, w=None, A=None):
self.width = w
self.area = A
self.length = l
def area(self):
return self.length * self.width
def circumference(self):
return 2*(self.length + self.width)
def calculate_length(self):
return self.area / self.width
Gör följande möjligt:
>>> my_square = square()
>>> vars(my_square)
{'width': None, 'area': None, 'length': None}
>>> my_square.width = 5
>>> my_square.area = 30
>>> my_square.length = my_square.calculate_length()
>>> vars(my_square)
{'width': 5, 'area': 30, 'length': 6.0}
Så glad i hågen tänkte jag att "AHA!" då borde nedan fungera:
class square:
def __init__(self, l=None, w=None, A=None):
self.width = w
self.area = A
if type(l) == None:
self.lenght = calculate_length()
else:
self.length = l
def area(self):
return self.length * self.width
def circumference(self):
return 2*(self.length + self.width)
def calculate_length(self):
return self.area / self.width
>>> my_square = square(,5,30)
SyntaxError: invalid syntax #Att sätta in ingenting som l fungerar inte
>>> my_square = square(None,5,30) #Sätta in None som l fungerar
>>> vars(my_square)
{'width': 5, 'area': 30, 'length': None} #Tyvärr utförs inte beräkningen för l
Så kanske är jag tillbaka på ruta 1 igen? Jag hoppas det på något sätt framgår vad jag försöker åstadkomma i varje fall
Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |