Handy

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tooltime
User
Beiträge: 2
Registriert: Montag 8. Dezember 2014, 18:26

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
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
BlackJack

Ergänzend: Konventionell werden Namen für Werte und Funktionen/Methoden in Python `klein_mit_unterstrichen` geschrieben.
Tooltime
User
Beiträge: 2
Registriert: Montag 8. Dezember 2014, 18:26

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
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.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Benutzeravatar
mabathibis
User
Beiträge: 4
Registriert: Sonntag 14. Dezember 2014, 09:16

@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
Irren ist menschlich.
Aber wer richtig Mist bauen will,
braucht einen Computer !!!
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.
Benutzeravatar
mabathibis
User
Beiträge: 4
Registriert: Sonntag 14. Dezember 2014, 09:16

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
Irren ist menschlich.
Aber wer richtig Mist bauen will,
braucht einen Computer !!!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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?
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.
Antworten