Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in Attributdeskriptoren in Python (Codebeispiel)

Detaillierte Einführung in Attributdeskriptoren in Python (Codebeispiel)

不言
不言nach vorne
2018-12-12 10:37:112772Durchsuche

Dieser Artikel bietet Ihnen eine detaillierte Einführung (Codebeispiel) über Attributdeskriptoren in Python. Ich hoffe, dass er für Freunde hilfreich ist.

Als Anfänger lese ich ständig Dinge und lerne jeden Tag Wissen. Heute werde ich Ihnen eine gute Sache vorstellen – Attributdeskriptor

Was ist ein Attributdeskriptor?

Tatsächlich ist jede in einer Klasse implementierte magische Funktion unter set__, __get__, __delete ein Attributdeskriptor.

Als nächstes definieren wir einen Attributdeskriptor:

class IntegerField:
    def __get__(self, instance, owner):
        pass
    def __set__(self, instance, value):
        pass
    def __delete__(self, instance):
        pass
class User:
    high= IntField()

__get__: Wenn wir dieses Attribut mit einer Klasse oder Instanz aufrufen, wird das Ergebnis der Funktion __get__ zurückgegeben.
__set__: Python ruft diese Funktion auf, wenn wir Instanz verwenden, um den Attributwert festzulegen. Es gibt keine Einschränkungen für den Unterricht.
__delete__: Python ruft diese Funktion auf, wenn wir versuchen, das Attribut mithilfe einer Instanz zu löschen. Es gibt keine Einschränkungen für den Unterricht.
Wie benutzt man dieses Ding? Als Nächstes werde ich den obigen Code für alle

class IntegerField:
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        if not isinstance(value,numbers.Integral):
            raise ValueError("请输入一个整数")
        self.value=value
        
    def __delete__(self, instance):
        pass
class User:
    high=IntegerField() 
#验证代码
if __name__ == '__main__':
    user=User()
    user.high='175'    #报错,ValueError:请输入一个整数
    User.high=175    #正确执行,不报错

ändern, sodass wir Attributdeskriptoren verwenden können, um den Attributen eine bestimmte Logik zuzuordnen.
Tatsächlich ist es unter dem Attributdeskriptor auch unterteilt in
1 Datendeskriptor: implementiert __set__, __get__

if __name__ == '__main__':
    user=User()
    user.high=175
    print(user.__dict__)    #high是不放入__dict__中的,优先查找数据描述符中的值
    user.__dict__["high"]="abc"    #这样赋值时可以的,并且可以放入__dict__中
    print(user.high)    #会报错,因为在调用__get__方法时并没有value属性

2. Nicht-Daten: implementiert __get__, implementiert aber nicht __set__

class NonField:
    def __init__(self, high=170):
        self.value = high

    def __get__(self, instance, owner):
        return self.value


class User:
    high = NonField()


if __name__ == '__main__':
    user = User()
    user.high = '175'    #会放入user.__dict__中
    print(user.__dict__)

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Attributdeskriptoren in Python (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen