suchen
HeimBackend-EntwicklungPython-TutorialAusführliche Einführung und Verwendung von Klassenattributen

Ausführliche Einführung und Verwendung von Klassenattributen

Jun 21, 2017 pm 04:36 PM
python对象属性geh tief面向

Eingabe in die interaktive Umgebung:

 1 >>> class A: 2     a=0 3     def __init__(self): 4         self.a=10 5         self.b=100 6  7          8 >>> a=A() 9 >>> a.a10 1011 >>> a.b12 10013 >>> A.a14 015 >>> A.b16 Traceback (most recent call last):17   File "<pyshell>", line 1, in <module>18     A.b19 AttributeError: type object 'A' has no attribute 'b'20 >>></module></pyshell>

Wie unten gezeigt:


Noch in einer interaktiven Umgebung:

 1 >>> class A: 2     a=0 3     def __init__(self): 4         self.a=10 5         self.b=100 6  7          8 >>> a=A() 9 >>> getattr(a,'a')#用getattr()函数获取实例a中a属性的值10 1011 >>> setattr(a,'a',20)#设置实例a中a属性的值为2012 >>> getattr(a,'a')#用getattr()函数获取实例a中a属性的值13 2014 >>> hasattr(a,'b')#测试实例a中是否包含属性b15 True

Bildanzeige:

Die drei Funktionen dieses Reflexionsmechanismus, die Zeichenfolgen zum Betreiben von Klassenattributen und -methoden verwenden, werden nicht häufig verwendet. Es kommen Schreibframeworks und andere Spezialprojekte zum Einsatz.


 1 class Washer: 2  3     def __init__(self,water=10,scour=2): 4         self._water=water #不想让用户直接访问实例变量,可以标志成私有 5         self.scour=scour 6         #属性包装,将water属性包装成方法,用户使用water时实际是访问的方法 7     @property 8     def water(self):#如果用户使用 实例.water相当于访问这个方法,而不是真的访问属性 9         return self._water10 11     def set_water(self,water):12         self.water=water        
13 14     def set_scour(self,scour):15         self.scour=scour        
16 17     def add_water(self):18         print('Add water:',self.water)19 20     def add_scour(self):21         print('Add scour:',self.scour)22 23     def start_wash(self):24         self.add_water()25         self.add_scour()26         print('Start wash...')27         28 if __name__=='__main__':29     w=Washer()30     #w.start_wash()31     print(w.water)# 可以像访问属性一样访问方法

Zu diesem Zeitpunkt kann der Benutzer jedoch weiterhin über w._water auf die Instanzeigenschaften zugreifen. gekapselt Nicht gut, es wird nicht automatisch überprüft, ob die Daten Gleitkommadaten sind, nicht gut.

Wie löst man das Problem?

Verwendung von @property.setter

 1 class Washer: 2  3     def __init__(self,water=10,scour=2): 4         self._water=water #不想让用户直接访问实例变量,可以标志成私有 5         self.scour=scour 6         #属性包装,将water属性包装成方法,用户使用water时实际是访问的方法 7     @property 8     def water(self):#如果用户使用 实例.water相当于访问这个方法,而不是真的访问属性 9         return self._water10     11     @water.setter   #新添加代码12     def water(self,water):13         if 0<water></water>

Ergebnis:

Außerdem sehr neugierig @water. Was genau ist das Setterwasser? Ich habe festgestellt, dass es als neues Instanzattribut verstanden werden kann und nichts mit den formalen Parametern des Konstruktors zu tun hat. Zum Beispiel im Bild unten

Ein weiteres Beispiel:

Das Ergebnis ist immer noch:

kann auch eine Löschvariable umschließen, @water.delete

-------------------------------------- ------- ---------

Dieser Code zeigt an, dass die Wasservariable umgeschrieben werden kann,

-- ------- ----------------------------------

Der obige Blockcode zeigt an, dass die Wassereigenschaft gelesen werden kann.

---------------- ------ -

Die letzte Verwendung besteht darin, den Eigenschaftsdekorator @property zu verwenden, um eine neue virtuelle Eigenschaft zu definieren.

 1 class Washer: 2  3     def __init__(self,water=10,scour=2): 4         self._water=water #不想让用户直接访问实例变量,可以标志成私有 5         self.scour=scour 6         self.year=2000#这是生产日期 7         #属性包装,将water属性包装成方法,用户使用water时实际是访问的方法 8     @property 9     def water1(self):#如果用户使用 实例.water相当于访问这个方法,而不是真的访问属性10         return self._water11     12     @water1.setter13     def water1(self,water):14         if 0<water></water>

Laufergebnisse:


Deskriptor

Die Bedeutung des Deskriptors besteht darin, eine Duplizierung des Definitionscodes von Instanzattributen mit denselben qualifizierten Attributen zu vermeiden. Zum Beispiel:

 1 class NonNeg:#数据描述符 2     def __init__(self,default=0):#构造方法 3         self.default=default#一个实例属性 4     def __get__(self,instance,owner):#协议方法 5         return self.default 6     def __set__(self,instance,val):#协议方法 7         if val>0: 8             self.default=val 9         else:10             print('The value must be NonNegative!')11     def __delete__(self,instance):#协议方法12         pass13 class Movie:14     rating=NonNeg()#描述符类NonNeg作另一个类Movie的属性,rating是Movie的类属性。15     score=NonNeg()16     17 if __name__=='__main__':18     m=Movie()19     print('rating:',m.rating)20     print('score:',m.score)#输出默认值default21     m.rating=80#使用__set__协议方法22     print('rating:',m.rating)#使用到 __get__协议方法23     m.score=-324     print('score:',m.score)

输出结果:

---------------------------------------

下面说明所有的 类成员函数都是非数据描述符。

 

在这个交互式环境中可以看出pr这个类方法仅有__get__协议,三个不全,所以是非数据描述符。

----------------------------------------------------------------

 同名的实例属性和非数据描述符(以类方法为例)同时出现时,访问的优先级是什么?

 

 再看:

为啥结果还不一样了?再做一遍老师的例子:

重新打开idel之后重新写了一遍:

总结如下:

在交互式环境中,

若在类内实例方法中定义与此方法名想同的实例变量pr,则在类外实例化此类后,实例.pr 首先访问的是此实例变量,实例.pr() 肯定访问的是类内实例方法。若再类外实例中定义一个  实例.pr=20,则再访问 实例.pr时则访问的是刚定义的实例属性 实例.pr=20。

若在类内没有定义与类方法同名的实例属性,则实例.pr访问的是类内的实例方法,若又在类实例化后实例下定义同名的的实例属性pr,则 实例.pr访问的刚定义的。。。

感觉好混乱:若访问过t.pr()再访问t.pr,t.pr就为10了,若没有访问过t.pr()直接访问t.pr,这个就先访问的是method Tst.pr of <__main__.tst object>

 

 1 class Tst: 2     def pr(self): 3         self.pr=10 4         print('Tst') 5 t1=Tst() 6 t1.pr()#输出Tst 7 t1.pr#啥都没有输出 8 print(t1.pr)#输出10 9 print('下面实例化后不访问t.pr()直接访问t.pr:')10 t2=Tst()11 t2.pr#啥都没输出12 print(t2.pr)#输出了bound method Tst.pr of <__main__.tst></__main__.tst>

但后来在实例下新定义的同名实例属性会覆盖原先类中定义的实例方法。优先级知道了吧。

 


 

 

 扩展:

 1 class Tst: 2     def __init__(self,default=1): 3         self.water=default 4     def __call__(self): 5         print('包含call函数的类,他的实例可以直接当做函数使用。') 6     def info(self): 7         print("pass") 8  9 t=Tst()10 t()

当调用t()时只调用类中__call__函数。

--------------------------------------------


解答如下:

 1 class surfaceNum:#定义一个描述类 2     def __init__(self,default=1): 3         self.number=default 4     def __get__(self,instance,owner):#参数instance和owner暂时没有用到,只有self是固定名参数 5         return self.number 6     def __set__(self,instance,val):#参数instance暂时没有用到 7         if 0<val></val>
View Code

这个题目是上节课题目的拔高,上节课题目及解答见链接

 

Das obige ist der detaillierte Inhalt vonAusführliche Einführung und Verwendung von Klassenattributen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Was sind einige gängige Operationen, die an Python -Arrays ausgeführt werden können?Was sind einige gängige Operationen, die an Python -Arrays ausgeführt werden können?Apr 26, 2025 am 12:22 AM

PythonarraysSupportvariousoperationen: 1) SlicicingExtractsSubsets, 2) Anhang/Erweiterungen, 3) Einfügen von PlaceSelementsatspezifischePositionen, 4) Entfernen von Delettel, 5) Sortieren/ReversingChangesorder und 6) compredewlistenwlists basierte basierte, basierte Zonexistin

In welchen Anwendungsarten werden häufig Numpy -Arrays verwendet?In welchen Anwendungsarten werden häufig Numpy -Arrays verwendet?Apr 26, 2025 am 12:13 AM

NumpyarraysaresessentialForApplicationsRequeeFoughnumericalComputations und Datamanipulation

Wann würden Sie ein Array über eine Liste in Python verwenden?Wann würden Sie ein Array über eine Liste in Python verwenden?Apr 26, 2025 am 12:12 AM

UseanArray.ArrayoveralistinpythonwhendealingwithhomogenousData, Performance-CriticalCode, OrInterfacingwithCcode.1) HomogenousData: ArraysSavemoryWithtypedElements.2) Performance-CriticalCode: ArraySaveMoryWithtypedElements.2) Performance-CriticalCode: ArraysFerbetterPerPterPerProrMtorChorescomeChormericalcoricalomancomeChormericalicalomentorMentumscritorcorements.3) Interf

Werden alle Listenoperationen von Arrays unterstützt und umgekehrt? Warum oder warum nicht?Werden alle Listenoperationen von Arrays unterstützt und umgekehrt? Warum oder warum nicht?Apr 26, 2025 am 12:05 AM

Nein, NOTALLLISTOPERATIONSARESURDEDBYARAYS UNDVICEVERSA.1) ArraysDonotsupportdynamicoperationslikeAppendorinStResizing, die impactSperformance.2) listsDonotguaranteConstantTimeComplexityfordirectAccesslikearraysDo.

Wie können Sie in einer Python -Liste auf Elemente zugreifen?Wie können Sie in einer Python -Liste auf Elemente zugreifen?Apr 26, 2025 am 12:03 AM

ToaccesselementSinapythonlist, verwenden Indexing, Negativindexing, Slicing, Oriteration.1) IndexingStartsat0.2) NegativeIndexingAccessses aus der THEend.3) SlicingExtractSporions.4) itererationSforloopsorenumerate.AlwaySChEckLegthtoavoidIndexerror.

Wie werden Arrays im wissenschaftlichen Computer mit Python verwendet?Wie werden Arrays im wissenschaftlichen Computer mit Python verwendet?Apr 25, 2025 am 12:28 AM

Arraysinpython, besondersvianumpy, arecrucialInScientificComputingFortheirefficience undvertilität.1) Sie haben festgelegt, dass die Fornerikerne, Datenanalyse und Machinelarning.2) Numpy'SimplementationIncensuresFasteroperationsdanpythonlisten.3) Araysensableableableableableableableableableableableableableableableableableableableableableableableableableable

Wie gehen Sie mit verschiedenen Python -Versionen im selben System um?Wie gehen Sie mit verschiedenen Python -Versionen im selben System um?Apr 25, 2025 am 12:24 AM

Sie können verschiedene Python -Versionen mithilfe von Pyenv, Venv und Anaconda verwalten. 1) Verwalten Sie PYENV, um mehrere Python -Versionen zu verwalten: Installieren Sie PyEnv, setzen Sie globale und lokale Versionen. 2) Verwenden Sie VenV, um eine virtuelle Umgebung zu erstellen, um Projektabhängigkeiten zu isolieren. 3) Verwenden Sie Anaconda, um Python -Versionen in Ihrem Datenwissenschaftsprojekt zu verwalten. 4) Halten Sie das System Python für Aufgaben auf Systemebene. Durch diese Tools und Strategien können Sie verschiedene Versionen von Python effektiv verwalten, um den reibungslosen Betrieb des Projekts zu gewährleisten.

Was sind einige Vorteile bei der Verwendung von Numpy -Arrays gegenüber Standard -Python -Arrays?Was sind einige Vorteile bei der Verwendung von Numpy -Arrays gegenüber Standard -Python -Arrays?Apr 25, 2025 am 12:21 AM

NumpyarrayShaveseveraladVantagesOverStandardPythonArrays: 1) SiearemuchfasterDuetoc-basiert, 2) sie istaremoremory-effizient, insbesondere mit mit LaShlargedatasets und 3) sie können sich mit vektorisierten Funktionsformathematical und Statistical opertical opertical opertical operticaloperation, Making

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.