Objektattribute aus einer Liste sind nicht ansprechbar

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
progger
User
Beiträge: 6
Registriert: Mittwoch 21. März 2018, 21:13

Hi Leute,

habe eine Problem und finde gerade nirgends eine Lösung. Die beiden unten stehenden Klassen, sind wie folgt definiert:
In der Klasse FuzzerAttributes(object): existiert eine Liste, die mit HttpPacket() Paketen befüllt wird, diese werden in einem Sniffer eingesetzt. Das passt auch alles soweit. Mein Problem ist, das wenn ich mir die Liste wieder zurückgeben lasse kann ich mit dem . Operator nicht mehr auf die Attribute zugreifen. (siehe unteren Code Abschnitt) Was mach ich falsch??
class HttpPacket(object):

def __init__(self):
self._method = ''
self._path = "/index.html"
self._get_query = ""
self._post_payload = ""
self._host = "localhost"
self._user_agent = ""

def __eq__(self, other):
return self._path == other._path and \
self._method == other._method and \
self._post_payload == other._post_payload and \
self._get_query == other._get_query


def setMethod(self, meth):
self._method = meth

def getMethod(self):
return self._method

def setPath(self, path):
self._path = path

def getPath(self):
return self._path

def setGET_Query(self, get):
self._get_query

def getGET_Query(self):
return self._get_query

def setPOST_Payload(self, post):
self._post_payload = post

def getPOST_Payload(self):
return self._post_payload

def setHost(self, host):
self._host = host

def getHost(self):
return self._host

def setUserAgent(self, agent):
self._user_agent = agent

def getUserAgent(self):
return self._user_agent


class FuzzerAttributes(object):

def __init__(self):
self._ip ="127.0.0.1"
self._port =9090
self._iface = 'lo'
self._catchedPackets = [] # HttpPacket List

number_of_packets = 0

def set_ip(self, ip):
self._ip = ip

def set_port(self, port):
self._port = port

def get_ip(self):
return self._ip

def get_port(self):
return self._port

def set_iface(self, iface):
self._iface = iface

def get_iface(self):
return self._iface

def add_HttpPacket(self, pck=HttpPacket):
self._catchedPackets.append(pck)
self.number_of_packets +=1

def get_HttpPacktList(self):
return self._catchedPackets
# ---------------------------------------------------------------


fuzz_attr = FuzzerAttributes()
l1 = HttpPacket()
l2 = HttpPacket()
l3 = HttpPacket()
fuzz_attr.add_HttpPacket(l1)
fuzz_attr.add_HttpPacket(l2)
fuzz_attr.add_HttpPacket(l3)

list = fuzz_attr.get_HttpPacktList()

for iter, i in list:
print "---------------------------------------"
print "Aktuell Pck:" + iter +"\n"
i. <---- # Attribute erscheinen nicht ?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@progger: die ganzen »set_«- und »get_«-Methoden kannst Du ersatzlos löschen. Es ist viel einfacher direkt auf die Attribute zuzugreifen. Besser ist es auch, »HttpPacket« als NamedTuple zu definieren, also die Klasse unveränderbar zu machen. Instanzen sollten nach der Initialisierung fertig sein. Deine Instanzen sind aber nur mit dummy-Werten gefüllt. Dagegen sollte »number_of_packets« ein Property sein, das die Länge der Liste »catchedPackets« zurückgibt. Der Defaultwert bei »add_HttpPacket« ist ziemlich unsinnig. »list« ist ein schlechter Name weil er die eingebaute Klasse »list« überdeckt. Der Inhalt der Liste ist nicht in zwei Werte entpackbar. Was erwartest Du ist in »iter« oder »i«?

Code: Alles auswählen

from collections import namedtuple

HttpPacket = namedtuple("HttpPacket", "method, path, get_query, post_payload, host, user_agent")

class FuzzerAttributes(object):
    def __init__(self):
        self.ip = "127.0.0.1"
        self.port = 9090
        self.iface = 'lo'
        self.catched_packets = []       # HttpPacket List

    @property
    def number_of_packets(self):
        return len(self.catched_packets)

    def add_http_packet(self, pck):
        self.catchedPackets.append(pck)
progger
User
Beiträge: 6
Registriert: Mittwoch 21. März 2018, 21:13

Dank für die schelle Antwort,

nett auch für die Korrektur, aber teils hatte das schon auch Sinn, so sind die "dummy Werte" als default Werte gedacht. Diese können kann mit klassischen getter und setter bearbeitet werden. Aber das ist jetzt nicht der Punkt.
Die Liste ist auf jeden Fall mit den Objekten befüllt, da ich aber hauptsächlich mit C++ arbeite und ich hier wohl auf ein Problem stoße das durch fehlende Typisierung bzw. meine Unkenntniss auftritt weiß ich einfach nicht, wie ich an die Attribute (Variablen) der Listenobjekte rankommen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@progger: selbst in C++ würde man nicht so programmieren, aber wenn Du nicht Python programmieren willst, warum tust Du es dann?

Du bekommst schon in der Zeile mit for einen TypeError.

Code: Alles auswählen

for packet in fuzz_attr.catched_packets:
    print(packet.host)
progger
User
Beiträge: 6
Registriert: Mittwoch 21. März 2018, 21:13

Woran liegt das?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Woran liegt was?
progger
User
Beiträge: 6
Registriert: Mittwoch 21. März 2018, 21:13

Ganz generell warum kann ich mir die Liste so wie ich es gemacht habe nicht verwenden bzw. dann die Objekte- bzw. deren Attribute nicht verwenden
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@progger: warum kann man Listen nicht zum Kaffeekochen benutzen? Wie willst Du denn Listen verwenden?
progger
User
Beiträge: 6
Registriert: Mittwoch 21. März 2018, 21:13

Ey was ist eigentlich dein Problem. Für was kommentierst du eigentlich mein Code wenn du hier nur Mist von dir gibst. Ich hatte eine einfache Frage, die Antwort darauf besteht vermutlich aus zwei Sätzen und statt jemandem weiter zu helfen der sich hier an das Forum wendet kommst du mir dumm.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Lies doch mal deinen Code und die erste Anwort.
Du packst Objekte in eine Liste und versuchst dann Tupel rauszuholen.
Und die anderen Fehler findest du dann auch noch.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
progger
User
Beiträge: 6
Registriert: Mittwoch 21. März 2018, 21:13

Danke für den sarkasmusfreien Hinweis!
Antworten