Frage

Ich möchte wissen, wie Variablen in Python für Objekte und Funktionsnamen zu verwenden. In PHP können Sie dies tun:

$className = "MyClass";

$newObject = new $className();

Wie machen Sie diese Art der Sache in Python? Oder bin ich absolut nicht einige grundlegenden Unterschiede mit Python zu schätzen, und wenn ja, was ist das?

War es hilfreich?

Lösung

In Python

className = MyClass
newObject = className()

Die erste Zeile macht die Variable className auf die gleiche Sache wie MyClass beziehen. Dann wird die nächste Zeile ruft den MyClass Konstruktor durch die className Variable.

Als ein konkretes Beispiel:

>>> className = list
>>> newObject = className()
>>> newObject
[]

(In Python list ist der Konstruktor für die Klasse list.)

Der Unterschied ist, dass in PHP, können Sie den Namen der Klasse repräsentieren Sie als Zeichenfolge beziehen möchten, während in Python Sie direkt die gleiche Klasse verweisen können. Wenn Sie muss verwenden, um eine Zeichenfolge (zum Beispiel, wenn der Name der Klasse erstellt wird dynamisch), dann müssen Sie andere Techniken verwenden.

Andere Tipps

, dass some_module Unter der Annahme, hat eine Klasse mit dem Namen "class_name":

import some_module
klass = getattr(some_module, "class_name")
some_object = klass()

soll ich beachten Sie, dass Sie hier vorsichtig sein sollten: Strings in Code drehen kann gefährlich sein, wenn die Zeichenfolge vom Benutzer kommen, so sollten Sie die Sicherheit im Auge in dieser Situation halten. :)

Eine andere Methode (unter der Annahme, dass wir noch verwenden "class_name"):

class_lookup = { 'class_name' : class_name }
some_object = class_lookup['class_name']()  #call the object once we've pulled it out of the dict

Die letztere Methode ist wahrscheinlich der sicherste Weg, dies zu tun, so ist es wahrscheinlich, was Sie, wenn möglich verwenden sollten.

Wenn Sie eine dynamische Klasse in Python (das heißt, dessen Name eine Variable) erstellen Sie können Typen verwenden (), die 3 params nimmt: Name, Basen, attrs

>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})

<class '__main__.MyClass'>

>>> inst = klass()
>>> inst.msg
foobarbaz
  • Hinweis jedoch, dass dies nicht ‚instantiate‘ das Objekt (das heißt nicht nennen Konstrukteure etc. Es erstellt eine neue (!) Klasse mit dem gleichen Namen.

Wenn Sie diese:

class MyClass:
    def __init__(self):
        print "MyClass"

Sie dann in der Regel tun dies:

>>> x = MyClass()
MyClass

Aber man könnte dies auch tun, das ist, was ich denke, Sie fragen:

>>> a = "MyClass"
>>> y = eval(a)()
MyClass

Aber, sehr vorsichtig sein, wo Sie die Zeichenfolge, die Sie „eval ()“ auf verwenden -. Wenn es vom Benutzer gekommen ist, sind Sie im Wesentlichen eine enorme Sicherheitslücke zu schaffen

Update:. Mit type() wie in coleifer Antwort gezeigt ist weit überlegen zu dieser Lösung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top