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