参与拿奖:本文已参与「新人创作礼」活动,一起开启掘金创作之路
复制代码
1. Exemples supplémentaires de surcharge d'opérateur :
L'addition, la soustraction et la multiplication et division scalaires sont effectuées sur des vecteurs tridimensionnels par surcharge d'opérateurs :
① constructeur et destructeur de classe
#类定义及初始化:
class Vector:
list=[]
tuple=()
def __init__(self,t):
self.__value = len(t) #私有变量
if self.checkerror(t): #检查输入数据是否为三维数字实参
self.list=list(t)
self.tuple=tuple(self.list)
#self.tuple=tuple(list(t))
else:
print('Type error or the length should be equal to 3, maybe is too lang or too short!', end='\n')
#析构函数
def __del__(self):
del self.list
del self.tuple
复制代码
②Définir la méthode de classe et la méthode statique (utilisée pour vérifier s'il s'agit d'une variable numérique tridimensionnelle)
@classmethod #定义类方法
def mylist(cls):
return cls.list
@staticmethod #定义静态方法
def checkerror(t):
if len(t)!=3:
return False
for i in range(len(t)):
if isinstance(t[i],int):
return True
return False
复制代码
③Définir les valeurs d'attribut, vous pouvez définir des autorisations d'opération
#@property #方式一定义属性
def __set(self,n):
self.__value=n
return
#@property
def __get(self):
return self.__value
#@property
def __del(self):
del self.__value
return
def show(self):
print('公有方法打印私有属性值:',self.__value,end='\n')
value=property(__get,__set,__del)#方式二定义属性
复制代码
④ surcharge de l'opérateur
def __add__(self, t): #加法
if self.checkerror(t):
for i in range(len(t)):
self.list[i]+=t[i]
self.tuple=tuple(self.list)
return self.tuple
else:
print('Type error or the length should be equal to 3, maybe is too lang or too short!', end='\n')
def __sub__(self, t): #减法
if self.checkerror(t):
for i in range(len(t)):
self.list[i]-=t[i]
return tuple(self.list)
else:
print('Type error or the length should be equal to 3, maybe is too lang or too short!', end='\n')
def __mul__(self, n): #乘法
if isinstance(n,int):
for i in range(len(self.list)):
self.list[i]*=n
return tuple(self.list)
else:
print('Type error or the length should be equal to 3, maybe is too lang or too short!', end='\n')
def __truediv__(self, n): #除法
if isinstance(n, int):
for i in range(len(self.list)):
self.list[i] /= n
return tuple(self.list)
else:
print('Type error or the length should be equal to 3, maybe is too lang or too short!', end='\n')
复制代码
fonction d'essai
if __name__=='__main__':
t = (1, 2, 3)
myVector = Vector(t)
print('三维向量初始值,',t,end='\n')
print('加法运算符重载:', myVector + (1, 2, 3), end='\n')
print('减法运算符重载:', myVector - (2, 3, 4), end='\n')
print('乘法运算符重载:', myVector * 5, end='\n')
print('除法运算符重载:', myVector / 5, end='\n')
print('查看私有属性值:',myVector.value,end='\n')
myVector.value+=5
#print('修改私有属性值:',myVector.value+5,end='\n')
print('查看属性值是否被修改:',myVector.value,end='\n')
print('第二种查看属性值的方法',myVector._Vector__value,end='\n')
del myVector.value
print('删除私有属性值后:',myVector.value,end='\n')
复制代码
La sortie est la suivante :
三维向量初始值, (1, 2, 3)
加法运算符重载: (2, 4, 6)
减法运算符重载: (0, 1, 2)
乘法运算符重载: (0, 5, 10)
除法运算符重载: (0.0, 1.0, 2.0)
查看私有属性值: 3
查看属性值是否被修改: 8
第二种查看属性值的方法 8
#删除私有属性值之后,访问报错如下
print('删除私有属性值后:',myVector.value,end='\n')
AttributeError: 'Vector' object has no attribute '_Vector__value'
复制代码
2. Exemples supplémentaires sur l'héritage :
père:
class Person:
def __init__(self,name='',age=20,sex='man'):
self.setName(name)
self.setAge(age)
self.setSex(sex)
def setName(self,name):
if not isinstance(name,str):
print('type name error',end='\n')
return
self.name=name
def setAge(self,age):
if not isinstance(age,int):
print('Age type error!',end='\n')
return
self.age=age
def setSex(self,sex):
if sex not in ['man','woman']:
print('Sex type error!',end='\n')
return
self.sex=sex
def show(self):
print('Name:',self.name,end='\n')
print('Age:',self.age,end='\n')
print('Sex',self.sex,end='\n')
复制代码
Sous-classe :
class Student(Person):
def __init__(self,name='',age=16,sex='man',special=''):
super(Student,self).__init__(name,age,sex)
#Person.__init__(self,name,age,sex)方式二
self.setSpecial(special)
def setSpecial(self,special):
self.special=special
def show(self):
super(Student,self).show()
print('Special:',self.special,end='\n')
复制代码
Fonction d'essai :
if __name__=='__main__':
QinHsiu=Person('QinHsiu',22,'man')
Qxy=Student('Qxy',21,'woman','Computer')
QinHsiu.show()
Qxy.show()
Qxy.setSpecial('math')
Qxy.show()
复制代码
Le résultat est le suivant :
Name: QinHsiu
Age: 22
Sex man
Name: Qxy
Age: 21
Sex woman
Special: Computer
Name: Qxy
Age: 21
Sex woman
Special: math
复制代码
Notes d'étude :
1. La déclaration et l'utilisation des attributs dans la classe est la gestion des membres privés, qui sert à lui attribuer les permissions de l'objet ; 2. Lorsque la sous-classe est initialisée en héritage, si le constructeur déclaré n'est pas affiché, le constructeur de la classe parent sera appelé, mais l'accès aux membres privés et publics dans le constructeur diffère, par exemple :
1) La classe parent A a son propre constructeur
class A:
def __init__(self):
self.public()
self.__private()
def hello(self):
print('hello',end='\n')
def public(self):
print('This is a public function of A!',end='\n')
def __private(self):
print('This is a private of A!',end='\n')
复制代码
2) La sous-classe B n'a pas de constructeur
class B(A):
def public(self):
print('This is a public function of B!', end='\n')
def __private(self):
print('This is a private of B!', end='\n')
复制代码
3) La sous-classe C a son propre constructeur
class C(A):
def __init__(self):
self.public()
self.__private()
def public(self):
print('This is a public function of C!', end='\n')
def __private(self):
print('This is a private of C!', end='\n')
复制代码
Test ① Initialiser la sous-classe B et afficher les informations d'impression :
print('没有构造函数,继承父类构造函数后,',end='\n')
b1=B()
print('查看b1的信息:',dir(b1),end='\n')
复制代码
Le résultat est le suivant : lors de l'initialisation, la méthode privée de la classe parent est appelée et sa propre méthode publique est appelée :
没有构造函数,继承父类构造函数后,
This is a public function of B!
This is a private of A!
查看b1的信息: ['_A__private', '_B__private', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'hello', 'public']
复制代码
Test ②Initialiser la sous-classe C et afficher les informations d'impression
c1=C()
print('自己有构造函数继承父类后',end='\n')
print('查看c1的信息:',dir(c1),end='\n')
复制代码
Le résultat est le suivant, la sous-classe d'initialisation C appelle ses propres méthodes public 1 et private
This is a public function of C!
This is a private of C!
自己有构造函数继承父类后
查看c1的信息: ['_A__private', '_C__private', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'hello', 'public']
复制代码