Variable erhalten

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo zusammen
Im folgenden Code werden zwei n x n Matrizen angelegt. Eine mit sämtlichen Einträgen = 0, die andere mit den Einträgen zufällig aus {0, 1} gewählt.
Ich frage mich nun, ob und wie ich mit einer getter-Methode eine bestimmte Matrize zurückgeben kann, die ich mit einem Argument auswählen kann, oder ob ich für beide Matrizen eine eigene getter-Methode benötige.

Code: Alles auswählen

#!/usr/bin/env python

from numpy import zeros, array
from random import random

# ISING MODEL

class Lattice:
    def __init__(self, n): 
        self.zeroLattice = self.initZero(n)
        self.randLattice = self.initRand(n)

    def initZero(self, n): 
        return array(zeros((n,n))) 

    def initRand(self, n): 
        return array([[round(random()) for j in range(n)] for i in range(n)])

    def getLattice(self, which):
        return which 


if __name__ == '__main__':
    n = 4 
    lat = Lattice(n)
    print lat.getLattice(lat.zeroLattice)
So wie ich das jetzt mache, greife ich innerhalb des get() calls direkt auf die Variable zu, was ich ja genau vermeiden will.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

mzh hat geschrieben:So wie ich das jetzt mache, greife ich innerhalb des get() calls direkt auf die Variable zu, was ich ja genau vermeiden will.
Gibt es dafür einen guten Grund? Es ist völlig in Ordnung direkt auf die Objekte in einer Klasse zuzugreifen. Kann das sein, dass du von Java kommst?
BlackJack

@mzh: Was soll denn da übergeben werden? Du suchst hier nicht einfach nach einem ``if``/``else``!?

Deine Methoden sind keine "echten" Methoden. Mal von der `__init__()` abgesehen benutzen die alle das `self` nicht, also stellt sich die Frage was die auf der Klasse zu suchen haben!?

Für das Zufallsarray bietet `numpy` sicher einen eleganteren Weg. Mal so als Schnellschuss:

Code: Alles auswählen

In [1027]: numpy.random.rand(3, 3)
Out[1027]:
array([[ 0.26942259,  0.54378118,  0.93037092],
       [ 0.61565632,  0.19131543,  0.26354095],
       [ 0.69831269,  0.10036283,  0.66730737]])

In [1028]: numpy.random.rand(3, 3).round()
Out[1028]:
array([[ 0.,  1.,  0.],
       [ 0.,  1.,  1.],
       [ 1.,  1.,  0.]])
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Ursprünglich habe ich schon mit Java angefangen. So wie ich mich erinnere war es dort üblich, alle Attribute über ihre Accessormethoden zu erhalten.
@BlackJack: Wieso sind das keine Methoden? Die setzen ja die Werte für die beiden Matrizen.
[url=http://www.proandkon.com]proandkon.com[/url]
BlackJack

@mzh: In Java ist das üblich weil Java keine "properties" kennt und ausserdem das mit dem Zugriffschutz viel ernster nimmt. Python kennt berechnete Attribute und traut dem Programmierer mehr.

Das sind keine "echten" Methoden weil die nichts mit dem Objekt machen auf dem sie definiert sind. Man könnte beide `init*()`\s problemlos als Funktionen ausserhalb der Klasse schreiben.

Die erscheinen mir sowieso etwas zu simpel für eigene Methoden/Funktionen. Letztendlich würde das hier voll ausreichen:

Code: Alles auswählen

from numpy import zeros
from numpy.random import rand


class Lattice(object):
    def __init__(self, n):
        self.zeros = zeros((n, n))
        self.random = rand(n, n).round()


def main():
    n = 4
    lattice = Lattice(n)
    print lattice.zeros
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

ja, das scheint mir einzuleuchten.
Besten Dank für die Hinweise.
[url=http://www.proandkon.com]proandkon.com[/url]
Antworten