PythonNET - Abruf eines Klassenattributes schlägt fehl

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
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Guten Abend,

seit neulich arbeite ich mit PythonNet, um eine .NET DLL API zu benutzen.
Es war anfänglich etwas schwer die API zu verstehen,zu Mal ich nicht bemerkt habe, dass deren XML Dok hilfreicher ist als deren Textdatei, aber hat letztendlich geklappt.
Problem ist nur, dass es beim Aufruf eines Klassenattributes scheitert.
Zunächst ersteinmal den Code...

Code: Alles auswählen

import clr,sys,os
path = os.path.dirname(os.path.abspath(__file__))
sys.path.append(path)
clr.AddReference("LibCronusMAX")



import LibCronusMAX
from System import EventHandler


class CronusMaxAPI:
    device      = LibCronusMAX.SingleDevice()
    deviceInfo  = LibCronusMAX.DeviceInformation
    deviceCmd   = LibCronusMAX.CmCommandEx()

    def __init__(self):
        print(self.deviceInfo.Fw) #Hier ERROR!
        
        #self.device.DeviceInformationChanged += EventHandler[self.deviceInfo](self.deviceInfoChanged)
        self.device.StartWorkerThreads()
        
    def deviceInfoChanged(self):
        #</code...
        pass


CronusMaxAPI()
Und der Fehlercode...

Code: Alles auswählen

TypeError: instance property must be accessed through a class instance
Ich habe viel recherchiert, aber nichts brachte mich weiter.
Wenn ich etwas von den aufgerufenen Instanzen abfrage, funktioniert es, nur nicht bei der nur erstellten, also ohne Konstruktor.
Wo besteht also nun das Problem und wie/kann man das lösen?

Grüße,
xXSkyWalkerXx1
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Hinweis: die Klasse "LibCronusMAX.DeviceInformation" benötigt bzw. hat kein Konstruktor (falls jemand auf die Idee kommt^^).
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Die Fehlermeldung ist doch eindeutig: Was immer duntust, musst du mit der Instanz einer Klasse und nicht mit der Klasse direkt tun.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

sparrow hat geschrieben: Mittwoch 6. Mai 2020, 05:57 Die Fehlermeldung ist doch eindeutig: Was immer duntust, musst du mit der Instanz einer Klasse und nicht mit der Klasse direkt tun.
Ja, ist mir klar, nur ist die Klasse keine aufrufbare, sie hat kein Konstruktor, sondern nur Attribute. Sie enthält also nur Informationen.
In den Codebeispielen bei der API wurde die Klasse nirgends aufgerufen, auch in der API steht kein Konstruktor.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum benutzt du nicht einfach .NET und sparst dir den ganzen Wahnsinn, den du mit den Reibungsverlusten durch die Sprachintegration hast? C# ist eine ordentliche Sprache, die man gut benutzen kann. Und du bist eh im Windows Ökosystem verhaftet.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Also auf Enums kann ich wohl zugreifen, aber nicht auf simple variablen.

Warum ich nicht C# benutzen will? Weil ich keine Lust habe die Sprache extra zu lernen und dann mein Interface + CV Algorithmus umzuwandeln.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Frage ist, was schneller geht....
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

__deets__ hat geschrieben: Mittwoch 6. Mai 2020, 11:49 Die Frage ist, was schneller geht....
Ja, das ist immer 'ne gute Frage. ;D
Aber ich denke, dass muss man in dem Fall erstmal herausfinden, wie schnell alles gesamt ablaufen würde und inwiefern
man das noch optimieren könnte.
Antworten