Maison développement back-end Tutoriel Python Introduction approfondie et utilisation des attributs de classe

Introduction approfondie et utilisation des attributs de classe

Jun 21, 2017 pm 04:36 PM
python 对象 属性 aller en profondeur 面向

Entrée dans l'environnement interactif :

 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#10>", line 1, in <module>18     A.b19 AttributeError: type object 'A' has no attribute 'b'20 >>>
Copier après la connexion

Comme indiqué ci-dessous :


Toujours dans un environnement interactif :

 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
Copier après la connexion

Affichage d'images :

Les trois fonctions de ce mécanisme de réflexion qui utilisent des chaînes pour faire fonctionner les attributs et les méthodes de classe ne sont pas couramment utilisées. Des cadres d'écriture et d'autres projets spéciaux sont utilisés.


 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)# 可以像访问属性一样访问方法
Copier après la connexion

Mais à ce stade, l'utilisateur peut toujours accéder aux propriétés de l'instance via w._water, encapsulated Pas bon, il ne vérifiera pas automatiquement si les données sont en virgule flottante, pas bon.

Comment le résoudre ?

Utilisation de @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<=500:14             self._water=water15         else:16             print(&#39;set Failure!&#39;)17     18     def set_water(self,water):19         self.water=water        
20 21     def set_scour(self,scour):22         self.scour=scour        
23 24     def add_water(self):25         print(&#39;Add water:&#39;,self.water)26 27     def add_scour(self):28         print(&#39;Add scour:&#39;,self.scour)29 30     def start_wash(self):31         self.add_water()32         self.add_scour()33         print(&#39;Start wash...&#39;)34         35 if __name__==&#39;__main__&#39;:36     w=Washer()37     print(w.water)# 可以像访问属性一样访问方法38     #w._water=20 #为了不让用户这样直接给实例属性赋值,用下面的语句39     w.water=123 #可以像给属性赋值一样给方法赋值,并检测范围40     print(w.water)# 可以像访问属性一样访问方法
Copier après la connexion

Résultat :

Aussi, très curieuse @water. Qu'est-ce que l'eau de définition exactement ? J'ai trouvé qu'elle peut être comprise comme un nouvel attribut d'instance et n'a rien à voir avec les paramètres formels du constructeur. Par exemple, dans l'image ci-dessous

Autre exemple :

Le résultat est toujours :

peut également envelopper une variable de suppression, @water.delete

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

Ce code indique que la variable eau peut être réécrite,

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

Ce qui précède Le code de bloc indique que la propriété de l'eau peut être lue.

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

La dernière utilisation consiste à utiliser le décorateur de propriété @property pour définir une nouvelle propriété virtuelle.

 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<=500:15             self._water=water16         else:17             print(&#39;set Failure!&#39;)18     @property
19     def total_year(self): #定义一个虚拟实例属性,这个属性其实是一个方法,但是可以按照属性来用
20         return 2017-self.year21     22     def set_water(self,water):23         self.water=water        
24 25     def set_scour(self,scour):26         self.scour=scour        
27 28     def add_water(self):29         print(&#39;Add water:&#39;,self.water)30 31     def add_scour(self):32         print(&#39;Add scour:&#39;,self.scour)33 34     def start_wash(self):35         self.add_water()36         self.add_scour()37         print(&#39;Start wash...&#39;)38         39 if __name__==&#39;__main__&#39;:40     w=Washer()41     print(w.water1)# 可以像访问属性一样访问方法42     #w._water=20 #为了不让用户这样直接给实例属性赋值,用下面的语句43     w.water1=12344     print(w.water1)# 可以像访问属性一样访问方法45     print(w.total_year)46   47
Copier après la connexion

Résultats en cours d'exécution :


Descripteur

Le sens du descripteur est d'éviter de dupliquer le code de définition des attributs d'instance avec les mêmes attributs qualifiés. Par exemple, l'exemple suivant :

 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)
Copier après la connexion

输出结果:

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

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

 

在这个交互式环境中可以看出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 object
Copier après la connexion

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

 


 

 

 扩展:

 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()
Copier après la connexion

当调用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<7 and isinstance(val,int)==True: 8             self.number=val 9             Box.info_num(self)#Box类还没有创建,故不能引用Box.infor_num,哈哈,能创建啊10         else:11             print('please set the correct surface number!')12     def __delete__(self,instance):#协议方法13          pass14             15 class Box:#定义一个类名为Box,类名后不必有括号,类包含类属性和类方法,这个类没有定义类属性16     '''这是一个计算体积的类'''#这是这个类的__doc__属性,执行类后就可以在交互界面输入Box.__doc__查看这行说明文字了17     openstate=018     number=surfaceNum()19     def __init__(self):#这是类的构造函数,当实例化Box后会自动调用这个__init__方法20         self.length=0.0 #这是实例属性,在类内访问用self.length,在类外访问用  实例名.length21         self.width=0.022         self.height=0.023         self._color='red'       24         self.__valum=0.0#双下换线开头的变量表示私有变量,所以他为私有实例属性,只能在类内访问到25         26     @property27     def color(self):28         return self._color29     @color.setter30     def color(self,color):31         self._color=color32         33     def set_color(self,color):34         self._color=color    
35         36     def computevalum(self):#定义了一个类方法。37         self.__valum=self.length*self.width*self.height38         print('长度=',self.length,'宽度=',self.width,'高度=',self.height,'valum=',self.__valum)39 40     def info_color(self):41         #self.set_color(self._color)#在类中,函数调用函数的方式42         print('Box的颜色为',self._color)43 44     def open_box(self):45         if Box.openstate==0:46             print('打开了Box')47             Box.openstate=148         else:49             print('Box已经打开了,不能重复打开')50     def info_num(self):51         #self.set_color(self._color)#在类中,函数调用函数的方式52         53         print('Box面上的数字为',Box.number)54     #定义 __call__  函数,输出体积55     def __call__(self):56         self.__valum=self.length*self.width*self.height57         print('长度=',self.length,'宽度=',self.width,'高度=',self.height,'调用自身computa()输出:valum=',self.__valum)58         59 60     61     62 if __name__=='__main__':       
63     computa=Box() #实例化Box类64     computa.number =265     computa.info_num()66     computa.length=167     computa.width=268     computa.height=369     computa.computevalum()70     computa()#实例名函数调用__call__函数直接输出体积71     computa.set_color ('yellow')72     computa.info_color()73     computa.open_box()74     computa.color='green'75     computa.info_color()76     print('')77 78     computb=Box()#实例化Box类79     computb.length=280     computb.width=281     computb.height=382     computb.computevalum()83     computb.set_color ('black')84     computb.info_color()85     computb.open_box()
Copier après la connexion
View Code

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

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP et Python: exemples de code et comparaison PHP et Python: exemples de code et comparaison Apr 15, 2025 am 12:07 AM

PHP et Python ont leurs propres avantages et inconvénients, et le choix dépend des besoins du projet et des préférences personnelles. 1.Php convient au développement rapide et à la maintenance des applications Web à grande échelle. 2. Python domine le domaine de la science des données et de l'apprentissage automatique.

Comment entraîner le modèle Pytorch sur Centos Comment entraîner le modèle Pytorch sur Centos Apr 14, 2025 pm 03:03 PM

Une formation efficace des modèles Pytorch sur les systèmes CentOS nécessite des étapes, et cet article fournira des guides détaillés. 1. Préparation de l'environnement: Installation de Python et de dépendance: le système CentOS préinstalle généralement Python, mais la version peut être plus ancienne. Il est recommandé d'utiliser YUM ou DNF pour installer Python 3 et Mettez PIP: sudoyuMupDatePython3 (ou sudodnfupdatepython3), pip3install-upradepip. CUDA et CUDNN (accélération GPU): Si vous utilisez Nvidiagpu, vous devez installer Cudatool

Explication détaillée du principe docker Explication détaillée du principe docker Apr 14, 2025 pm 11:57 PM

Docker utilise les fonctionnalités du noyau Linux pour fournir un environnement de fonctionnement d'application efficace et isolé. Son principe de travail est le suivant: 1. Le miroir est utilisé comme modèle en lecture seule, qui contient tout ce dont vous avez besoin pour exécuter l'application; 2. Le Système de fichiers Union (UnionFS) empile plusieurs systèmes de fichiers, ne stockant que les différences, l'économie d'espace et l'accélération; 3. Le démon gère les miroirs et les conteneurs, et le client les utilise pour l'interaction; 4. Les espaces de noms et les CGROUP implémentent l'isolement des conteneurs et les limitations de ressources; 5. Modes de réseau multiples prennent en charge l'interconnexion du conteneur. Ce n'est qu'en comprenant ces concepts principaux que vous pouvez mieux utiliser Docker.

Python vs JavaScript: communauté, bibliothèques et ressources Python vs JavaScript: communauté, bibliothèques et ressources Apr 15, 2025 am 12:16 AM

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Comment est la prise en charge du GPU pour Pytorch sur Centos Comment est la prise en charge du GPU pour Pytorch sur Centos Apr 14, 2025 pm 06:48 PM

Activer l'accélération du GPU Pytorch sur le système CentOS nécessite l'installation de versions CUDA, CUDNN et GPU de Pytorch. Les étapes suivantes vous guideront tout au long du processus: CUDA et CUDNN Installation détermineront la compatibilité de la version CUDA: utilisez la commande NVIDIA-SMI pour afficher la version CUDA prise en charge par votre carte graphique NVIDIA. Par exemple, votre carte graphique MX450 peut prendre en charge CUDA11.1 ou plus. Téléchargez et installez Cudatoolkit: visitez le site officiel de Nvidiacudatoolkit et téléchargez et installez la version correspondante selon la version CUDA la plus élevée prise en charge par votre carte graphique. Installez la bibliothèque CUDNN:

Comment choisir la version Pytorch sous Centos Comment choisir la version Pytorch sous Centos Apr 14, 2025 pm 02:51 PM

Lors de la sélection d'une version Pytorch sous CentOS, les facteurs clés suivants doivent être pris en compte: 1. CUDA Version Compatibilité GPU Prise en charge: si vous avez NVIDIA GPU et que vous souhaitez utiliser l'accélération GPU, vous devez choisir Pytorch qui prend en charge la version CUDA correspondante. Vous pouvez afficher la version CUDA prise en charge en exécutant la commande nvidia-SMI. Version CPU: Si vous n'avez pas de GPU ou que vous ne souhaitez pas utiliser de GPU, vous pouvez choisir une version CPU de Pytorch. 2. Version Python Pytorch

Miniopen Centos Compatibilité Miniopen Centos Compatibilité Apr 14, 2025 pm 05:45 PM

Minio Object Storage: Déploiement haute performance dans le système Centos System Minio est un système de stockage d'objets distribué haute performance développé sur la base du langage Go, compatible avec Amazons3. Il prend en charge une variété de langages clients, notamment Java, Python, JavaScript et GO. Cet article introduira brièvement l'installation et la compatibilité de Minio sur les systèmes CentOS. Compatibilité de la version CentOS Minio a été vérifiée sur plusieurs versions CentOS, y compris, mais sans s'y limiter: CentOS7.9: fournit un guide d'installation complet couvrant la configuration du cluster, la préparation de l'environnement, les paramètres de fichiers de configuration, le partitionnement du disque et la mini

Comment faire fonctionner la formation distribuée de Pytorch sur CentOS Comment faire fonctionner la formation distribuée de Pytorch sur CentOS Apr 14, 2025 pm 06:36 PM

La formation distribuée par Pytorch sur le système CentOS nécessite les étapes suivantes: Installation de Pytorch: La prémisse est que Python et PIP sont installés dans le système CentOS. Selon votre version CUDA, obtenez la commande d'installation appropriée sur le site officiel de Pytorch. Pour la formation du processeur uniquement, vous pouvez utiliser la commande suivante: pipinstalltorchtorchVisionTorChaudio Si vous avez besoin d'une prise en charge du GPU, assurez-vous que la version correspondante de CUDA et CUDNN est installée et utilise la version Pytorch correspondante pour l'installation. Configuration de l'environnement distribué: la formation distribuée nécessite généralement plusieurs machines ou des GPU multiples uniques. Lieu

See all articles