关于python中魔术方法和getter与setter的简记

python中一切皆对象,即我们定义的类本身也是对象

   那么要注意每个类中可以写一些通用的方法,而且一般对外不可访问,即标识符首尾都有双下划线(没错__init__就是魔术方法之一),这些方法涉及到一些所有类可能都需要的属性,比如__len__可以返回长度,__repr__()直接返回调用这个对象的返回值,(感觉类似c++中的函数对象的处理)。还有__new__()等在init之前创建对象时最先调用的方法,在对象使用结束之后还有一个__del__方法来解除内存的引用标记(理解为删除对应内容,当不再使用时)

   这些魔法函数甚至可以重载运算符还有定义类之间的运算,自由度很高,而且可以自己处理健壮性的问题。

   详细的使用方法与作用见引用的网页:https://www.bbsmax.com/A/obzb3GYQJE/

以下是对类中getter与setter的使用和说明(jupyter notebook):

 1 %config ZMQInteractiveShell.ast_node_interactivity='all'
 2 #@property—把函数调用伪装成对属性的访问,数据描述符属性的优先级高于实例名称空间中的同名成员。
 3 # 使用@property,不用再像java中使用getter,setter方法去设置和访问类变量   
 4 # 这时,也只有通过@property,才能对实例变量进行访问或设置,实现了对变量访问的控制,
 5 
 6 class Student1():
 7     def __init__(self,name,age):  ###__init__实例初始化
 8         self.name = name       ####self:实例变量,变量的名字叫name
 9         self.__age=age
10         
11     @property #getter
12     def name1(self):
13         return self.name
14     
15     @name1.setter  # setter
16     def name1(self,newname):
17         self.name = newname
18         
19     @property #getter
20     def age(self):
21         return 0
22     
23     @age.setter  # setter
24     def age(self,newage):
25         self.__age = newage
26         
27 # 上面这样设置的是类变量可以被类实例随意访问,修改。
28 # 注意,这里的name1,如果和实例变量name重名会导致,无限递归!!!
29 # RecursionError: maximum recursion depth exceeded while calling a Python object
30 
31 # 但如果想让@property和类实例变量同名呢?  
32 # 将实例变量设置为私有(像age一样)就不会导致重名引发递归死机了
33 s1=Student1('jack',33)
34 s1.name1
35 
36 s1.age#getter
37 s1.age=22#setter
38 
39 s1.age
原文地址:https://www.cnblogs.com/zy1120192493/p/13295040.html