Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2038
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 16.04.17 08:13 
Hallo Forum

Problemstellung:
Ein Taschenrechner (Übungsprojekt) soll in Python(3.6) umgesetzt werden. Darin soll enthalten sein:
- Lokale Variablen
- 2 Konstruktoren (mit / ohne Parameter)
- 1 Eigenschaft
- 1 Methode

Nach dem Schema:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Taschenrechner rechner = new Taschenrechner(37);
            rechner.Addition(rechner.Zahl1, rechner.Zahl2);
            //Console.ReadKey();
        }
    }

    class Taschenrechner
    {
        private float _zahl1 = 0
        private float _zahl2 = 0;

        public Taschenrechner() { }

        public Taschenrechner(float zahl1, float zahl2) 
        {
            this._zahl1 = zahl1;
            this._zahl2 = zahl2;
        }

        public float Zahl1 
        {
            get { return this._zahl1; }
            set { this._zahl1 = value; }
        }

        public float Zahl2
        {
            get { return this._zahl2; }
            set { this._zahl2 = value; }
        }

        public void Addition(float a, float b)
        {
            Console.WriteLine(string.Format("{0} + {1} = {2}", a, b, a + b));
        }
    }
}


Da Python keine Kontruktoren per se hat, sondern eine __init__() Methode, tu ich mir schwer, einen parameterlosen "Konstruktor" bereitzustellen.
Erzeuge ich ein Objekt ohne Parameter, bekomme ich die Fehlermeldung:
Fehler #1 hat folgendes geschrieben:
TypeError: __init__() missing 2 required positional arguments: 'zahl1' and 'zahl2'

Dann werden mir nebenbei die Eigenschaften nicht erkannt:
Fehler #2 hat folgendes geschrieben:
TypeError: 'int' object is not callable

Vielleicht liegt es an dem fehlenden def davor. Wenn ich an jener Stelle def setze, habe ich eine "ungültige Synthax" = Fehler #3.

ausblenden Python-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
class Taschenrechner(object):
    __zahl1 = 0
    __zahl2 = 0

    def __init__(self, zahl1, zahl2):
        self.__zahl1 = zahl1
        self.__zahl2 = zahl2

    def Zahl1 = property(__zahl1, __zahl1) # Fehler #3
    Zahl2 = property(__zahl2, __zahl2)

    def Addition(a, b):
        print('{0} + {1} = {2}', a, b, a + b)

# In einer anderen .py Datei

from UProjekt1 import *

rechner = Taschenrechner() # Fehler #1
rechner = Taschenrechner(4,3)
zahl = rechner.Zahl1 # Fehler #2


Kennt sich jemand darin aus oder kann hilfreiche Tipps geben?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3805
Erhaltene Danke: 773

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: So 16.04.17 09:45 
Hallo,

wenn ich Python 2: Klassen (unter "Konstruktor") richtig verstehe, dann kannst du "Default-Argumente" angeben, also
ausblenden Python-Quelltext
1:
2:
3:
def __init__(self, zahl1 = 0, zahl2 = 0):
        self.__zahl1 = zahl1
        self.__zahl2 = zahl2

Und
ausblenden Python-Quelltext
1:
2:
__zahl1 = 0
__zahl2 = 0
solltest du löschen, da diese sonst wohl als statische Klassenmember verstanden werden (s. obiger Link "Statische Member").

Es gibt zwar auch zu Python 3 einen Link (Python 3: Klassen), aber dort stehen diese Sachen nicht so explizit drin (oder unterscheidet sich Python 3 von 2 so sehr?).

Und zu Properties s. Python 3: Properties - müsste also so funktionieren:
ausblenden Python-Quelltext
1:
2:
3:
4:
def __getZahl2(self):
        return self.__zahl2

Zahl2 = property(__getZahl2)

Diese Angaben sind (wie immer) ohne Gewähr ;-)

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2038
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 16.04.17 10:06 
Jede Angabe ist eine gute Angabe. ;) Ob es Unterschiede zwischen der Version 2 und 3 gibt: Ja die gibt es. Mir ist aufgefallen, dass ich mit Python 2.4, Befehle wie: print 'Einen Text' ... eingeben konnte. Ab der 3. Version heißt es nun: print('Einen Text'). Der Unterschied ist gewaltig. :D

Nachtrag

Besten Dank für die Hilfestellung Th69!
Dies sollte nun auch mit der 2er Version kompatibel sein:

ausblenden volle Höhe Python-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
class Taschenrechner(object):

    def __init__(self, zahl1 = 0, zahl2 = 0):
        self.Zahl1 = zahl1
        self.Zahl2 = zahl2
        
    @property
    def Zahl1(self):
        return self._zahl1
    
    @Zahl1.setter
    def Zahl1(self, zahl1):
        self._zahl1 = zahl1

    @property
    def Zahl2(self):
        return self._zahl2
    
    @Zahl2.setter
    def Zahl2(self, zahl2):
        self._zahl2 = zahl2

    def Addition(self, a, b):
        print('{0} + {1} = {2}'.format(a, b, a + b))

# in einer anderen .py Datei

from UProjekt1 import *

rechner = Taschenrechner(37)
rechner.Addition(rechner.Zahl1, rechner.Zahl2)


Etwas ist mir aufgefallen: Die Unterstriche in Python heben sich nicht nur optisch hervor, sondern haben auch eine Funktion.
Dabei wird zwischen den Attributen (protectedprivatepublic) wie folgt unterschieden:
ausblenden Python-Quelltext
1:
2:
3:
4:
5:
# Zum Beispiel
def __init__(self):
    self._protectedAttribut  # 1x Unterstrich
    self.__privateAttribut   # 2x Unterstrich
    self.publicAttribut      # kein Unterstrich

Das gilt ebenso für Methoden:
ausblenden Python-Quelltext
1:
2:
3:
4:
5:
6:
7:
# Das 'def' ... definiert eine Methode (mit / ohne Rückgabewert)
def _protectedMethod():
    # do something
def __privateMethod():
    # do something
def publicMethod():
    # do something

Somit könnte man Eigenschaften auch auf folgende Weise definieren:
ausblenden Python-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
# (private) Getter-Methode
def __getZahl(self):  
    return self.__zahl

# (private) Setter-Methode
def __setZahl(self, zahl):
    self.__zahl = zahl

# (public) Eigenschaft
Zahl = property(__getZahl, __setZahl)

Die Bereiche Protected und Private in Python unterscheiden sich zu jenen in C# und Delphi. So kann während einer Instanz wohl auf eine geschützte Methode zugegriffen werden, anders als bei einer privaten Methode, welche nichts von außen zulässt (setzen / abfragen):
ausblenden Python-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
class Test:
    def _protectedMethod(self):
        return 'Eine geschützte Methode'
    def __privateMethod(self):
        return 'Eine private Methode'

t = Test()
print(t._protectedMethod()) # funktioniert!
print(t.__privateMethod()) # funktioniert nicht!


Das Thema hat sich erledigt !!!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)