2014-12-01 2 views
8

Wir wissen, dass mit Notation:Bedingte Anweisungen in einer Klasse, aber außerhalb des Gültigkeitsbereichs der Funktion

class Foo(object): 

    a = 1 

    def __init__(self): 
     self.b = 2 

    def c(self): 
     print('c') 

wir statische Variable Foo.a erstellen können, ‚normale‘ Variable b, die nach dem Erstellen und Instanz zur Verfügung stehen wird von Foo und Verfahren c

Heute war ich wirklich überrascht, dass ich bedingte Anweisungen in einer Klasse verwenden können, aber außerhalb des Gültigkeitsbereichs der Funktion

class C(): 
    if True: 
     a = 1 
    b = 2 

Sprachen wie C++/Java, hat mich gelehrt, dass rechtliche Notation ähnelt:

class Name(): 
    variable = <expression> 

Könnten Sie andere Regeln beschreiben, die auf diesen speziellen Anwendungsbereich beziehen? Wie soll ich diesen Umfang nennen?

Antwort

11

Der Klassenkörper ist nur Python-Code. Es hat spezifische Bereichsregeln, aber sonst geht alles anders. Dies bedeutet, dass Sie Funktionen erstellen bedingt können:

class C: 
    if some_condition: 
     def optional_method(self): 
      pass 

oder ziehen Methoden aus anderen Ländern:

import some_module 

class D: 
    method_name = some_module.function_that_accepts_self 

usw.

Die Python-Dokumentation für class definitions Zustände:

Eine Klassendefinition ist eine ausführbare Anweisung.

und

Die Suite Klasse wird dann in einem neuen Ausführungs Rahmen ausgeführt (siehe Abschnitt Naming and binding), ein neu erstelltes lokalen Namespace und den ursprünglichen globalen Namespace. (Normalerweise enthält die Suite nur Funktionsdefinitionen.) Wenn die Ausführung der Klasse beendet ist, wird der Ausführungsrahmen verworfen, aber der lokale Namespace wird gespeichert. Ein Klassenobjekt wird dann mit der Vererbungsliste für die Basisklassen und dem gespeicherten lokalen Namespace für das Attributverzeichnis erstellt.

Beachten Sie die normalerweise in diesem Text. Im Wesentlichen wird der Klassenkörper als Funktion ausgeführt, und alles, was Sie in den Body-Namespace eingeben, wird zu einem Attribut in der Klasse.

Der *Naming and binding Abschnitt erfahren Sie, dann:

Der Umfang der Namen in einer Klasse Block definiert die Klasse Block beschränkt ist; es erstreckt sich nicht auf die Codeblöcke der Methoden

so Namen, die Sie in diesem Block definieren, kann nicht direkt in Methoden zugegriffen werden; Sie würden stattdessen class.name oder self.name verwenden.

1

In Java ist alles classes und object, classes sind Container, aber in Python ist alles object. Classes sind auch objects. wie functions(also objects), also, wenn Sie bedingte Anweisung in Funktion verwenden dann ermöglicht Python Ihnen, dies in Klassen zu tun.

wie: -

def A(): 
    if condition: 
     do something 
    elif condition: 
     do somethig 
    else: 
     do something 

gleiche

Class A() 
    if condition: 
     do something 
    elif condition: 
     do somethig 
    else: 
     do something 

können Sie Funktionen zuweisen, auch in einer Variablen zu speichern, wie Sie für Klassen tun

def A(): 
    pass 

a = A # is valid 

während in Java können Sie Funktion nicht außerhalb der Klassen definieren.

Verwandte Themen