Seite 1 von 1

Handy

Verfasst: Montag 8. Dezember 2014, 18:55
von Tooltime
Hallo liebes Python-Forum-Team,

da dies mein erster Beitrag ist, eine kurze Vorstellung. Ich bin 20 Jahre alt und interessiere mich sehr fürs programmieren. Erfahrung damit hab ich ca. seit zwei Monaten.
Hobbys: Leidenschaftlicher Spieler von Euro Truck Simulator 2. Außerdem halte ich mich sehr gern in der Natur auf.

So, jetzt zu meinem Problem.
Es geht um ein einfaches Handy, welches nur SMS versenden kann. Ich hab schon sehr vieles ausprobiert, aber irgendwo steh ich einfach auf dem Schlauch. Speziell geht es bei dem Problem um Objektorientierung:

Code: Alles auswählen

from datetime import datetime
class Message:
    def __init__(self, content,date, sender, to):
        self.content = content
        self.date = format(datetime(date))
        self.sender = sender
        self.to = to

    def getContent(self):
        return self

    def getDate(self):
        return self.date

    def getSender(self):
        return self

    def getTo(self):
        return self

    def setContent(self, content):
        self.content = content

    def date(self, date):
        self.date =date

    def sender(self, sender ):
        self.sender = sender

    def to(self, to):
        self.to = to

    def __str__(self):
        msg = self.content + ' '+ self.date + ' '+self.sender + ' '+ self.to
        return msg
So, meine erste Frage ist:
Ich hab doch 100% irgendwas bei dem Datumsformat falsch gemacht. Sobald ich das Programm über print usw. ausführen möchte, meckert das Programm immer über das Datum rum (ich möchte gern das aktuelle Datum erhalten).
Zweite Frage:
Wie kann ich es jetzt schaffen, dass eine SMS versendet wird, so dass auch alle Methoden verwendet werden?
Zur weiteren Information: Ich habe ein Package mit drei Dateien erstellt: SMS Handy, Message, Provider. Das hier aufgeführte Beispiel ist die Datei Message.

Ich habe im Moment ein großes Brett vor dem Kopf. Ich erhoffe mir einfach, dass ich eine andere Erklärung bekomm, zumal ich ein Mensch bin, der nicht gerne nachfragt, weil ich irgendwie alles mit der Brechstange versuchen will, was aber nicht der richtige Weg ist; darüber bin ich mir auch im klaren. Ich denke, dass mir in diesem Forum noch einiges klarer wird und ich an zukünftige Aufgaben keine all zu großen Überlegungen mehr benötige.
So, dass wars fürs erste. Im Voraus schonmal vielen Dank.

Gruß
Tooltime

Re: Handy

Verfasst: Montag 8. Dezember 2014, 19:17
von Sirius3
@Tooltime: Probleme beschreibt man am Besten, wenn Du den Traceback mitpostest. Zum Code: die Methoden `date`, `sender` und `to` werden durch ihre gleichlautenden Attribute in __init__ überschrieben. Im übrigen sind sowieso alle Methoden außer __init__ und __str__ bei Deiner Klasse überflüssig. In Python braucht man keine Getter und Setter, weil man direkt auf die Attribute zugreifen kann. In der __str__-Methode solltest Du .format benutzen, statt Strings mit + zusammenzustückeln.
Eine Datei kann mehr als eine Klasse enthalten und sollte das auch. Also drei Dateien sind zu viel.
Ansonsten kann ich nicht viel sagen, solange Du keinen Fehler mitschickst.

Re: Handy

Verfasst: Montag 8. Dezember 2014, 19:30
von BlackJack
Ergänzend: Konventionell werden Namen für Werte und Funktionen/Methoden in Python `klein_mit_unterstrichen` geschrieben.

Re: Handy

Verfasst: Dienstag 9. Dezember 2014, 18:22
von Tooltime
Vielen Dank euch beiden für die Antwort.
Zum Fehlercode: " self.date = format(datetime(date)) TypeError: Required argument 'month' (pos 2) not found

Weiter zur Aufgabe: Als Grundlage habe ich eine html. Datei mit Javacodes drin. In dieser Datei stehen sämtliche Methoden, welche rein müssen.

Ich poste am besten mal noch die zwei anderen Dateien, welche ich bis jetzt erstellt habe.
SMSHandy:

Code: Alles auswählen

class SMSHandy:
    def __init__(self, number, provider):
        self.number = number
        self.provider = provider
        self.received = []
        self.sent = []
        provider.register(self)

    def getNumber(self):
        return self

    def getProvider(self):
        return self

    def listReceived(self, listReceived):
        self.listReceived = listReceived

    def listSent(self, listSent):
        self.listSent =listSent

    def receiveSms(self, message):
        self.message = message

    def sendSms(self, to, content):
        self.to = to
        self.content = content

    def sendSmsDirect(self, peer, content):
        self.peer = peer
        self.content = content

    def setProvider(self, provider):
        self.provider = provider

    def deposit(self, amount):
        self.amount = int(amount)
Provider:

Code: Alles auswählen

class Provider:
    def __init__(self):
        self.subscriber = {}
        self.credit = {}

    def register(self, handy):
        self.subscriber[handy.getNumber()]=handy
        self.credit[handy.getNumber()]=100

    def send(self, message):

        try:
            if i in message == '*101#':
                print(self.credit)
        except ValueError:
            return False

    def deposit(self, number, amount):
        self.number = str(number)
        self.amount = int(amount)


i = '*101#'
Noch zur Erklärung:
Jedes neu registrierte Handy bekommt ein Startguthaben von 100 Einheiten. Des Weiteren soll bei der Eingabe "*101#" der Kontostand angezeigt und kein Guthaben abgezogen werden. Das sollte ich richtig gemacht haben.
Bei einer normalen SMS sollen 10 Einheiten abgezogen werden. Da bin ich zurzeit dran, hab aber noch keine richtige Lösung gefunden. Ich denke mir aber, dass ich einen Ansatz dazu finde, sobald ich weis, wie man eine SMS absenden kann.

Gruß
Tooltime

Re: Handy

Verfasst: Dienstag 9. Dezember 2014, 18:37
von BlackJack
@Tooltime: Der Quelltext enthält sehr viel unsinniges. Du solltest vielleicht mal Objektorientierung mit *Python* lernen statt ohne jegliche OOP-Kenntnisse versuchen Java zu programmieren aber mit Python-Syntax. Was soll das? Das macht irgendwie gar keinen Sinn.

Re: Handy

Verfasst: Mittwoch 10. Dezember 2014, 08:11
von Sirius3
@Tooltime: Zur SMSHandy-Klasse gilt im Wesentlichen das Selbe wie ich in meinem ersten Post schon zur anderen Klasse gesagt habe. Zusätzlich macht "sendSMS" keinen Sinn. "send" soll ja was tun, hier wird aber nur der Empfänger und Inhalt in die Handyklasse geschrieben. Also ein Handy, das sich die letzte SMS und nur die merk, aber nichts verschickt. Damit kann man nichts anfangen. Bei Provider was soll "i in message == '*101#' denn sein? Woher kommt das i?

Re: Handy

Verfasst: Sonntag 14. Dezember 2014, 17:01
von mabathibis
@Tooltime: Wenn du das ganze Datum mit Uhrzeit haben willst, kannst du auch folgendes verwenden :

Code: Alles auswählen

import time
self.time=time.asctime()
Wenn du allerdings nur das Datum brauchst kannst du diesen teil des Datums auch einzeln bekommen :

Code: Alles auswählen

import time
datum=time.asctime()
datum_splitted=datum.split(" ") #string.split(" ") zerteilt einen string an jedem in den klammern angegebenen Zeichen in eine liste
self.datum=datum_splitted[0]+" "+datum_splitted[1]+" "+datum_splitted[2]+" "+datum_splitted[4]
Ich hoffe ich konnte helfen

mabathibis

Re: Handy

Verfasst: Sonntag 14. Dezember 2014, 17:23
von BlackJack
@mabathibis: Eine Zeichenkettendarstellung von einer Zeitangabe zu verarbeiten ist keine gute Idee. Da machst Annahmen darüber wie das Ergebnis von `asctime()` aussieht. Wenn man nur das Datum haben möchte, sollte man ein `datetime.date`-Objekt verwenden.

Das zusammensetzen von Zeichenketten und Werten mit ``+`` ist auch eher BASIC als Python. In Python gibt es dafür die `format()`-Methode auf Zeichenketten.

Re: Handy

Verfasst: Sonntag 14. Dezember 2014, 18:25
von mabathibis
BlackJack hat geschrieben:@mabathibis: Eine Zeichenkettendarstellung von einer Zeitangabe zu verarbeiten ist keine gute Idee. Da machst Annahmen darüber wie das Ergebnis von `asctime()` aussieht. Wenn man nur das Datum haben möchte, sollte man ein `datetime.date`-Objekt verwenden.

Das zusammensetzen von Zeichenketten und Werten mit ``+`` ist auch eher BASIC als Python. In Python gibt es dafür die `format()`-Methode auf Zeichenketten.
@BlackJack:Also eigentlich müsste der String, den `asctime()` zurückgibt immer den gleichen Inhalt haben (?)
Ich habe das mal in der Konsole ausprobiert und das geht eigentlich. Wieso meinst du dann etwas
mit "Annahmen" ?

grüße

mabathibis

Re: Handy

Verfasst: Sonntag 14. Dezember 2014, 18:37
von cofi
Weil deine Annahmen momentan stimmen. Im konkreten Fall ist es noch einigermassen sicher, weil die Dokumentation eine Garantie ueber die Form des Strings gibt, aber sollte die Funktion in Zukunft etwas anders aussehen, stimmt die Annahme nicht mehr.
Und warum sollte man sich darauf einlassen, wenn es auch sichere Varianten ueber `datetime` gibt?

Re: Handy

Verfasst: Sonntag 14. Dezember 2014, 21:16
von BlackJack
@mabathibis: Ich hätte ohne Blick in die Dokumentation erwartet das die Darstellung als Zeichenkette durch Locale-Einstellungen beeinflusst werden kann. Aber auch so ist das eine Indirektion die ich nicht empfehlen würde, denn man ruft eine Funktion auf die Zeitinformationen in eine Zeichenkette umwandelt die man dann wieder in Teile zerlegt und neu zusammenbaut, statt gleich eine Funktion zu verwenden die eine Zeichenkette erstellt die man haben möchte.