zoukankan      html  css  js  c++  java
  • 关于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
  • 相关阅读:
    P2048 [NOI2010]超级钢琴
    [LOJ#6468.] 魔法
    [牛客小白月赛18] Forsaken的数列
    [JSOI2011]柠檬
    [TJOI2015]组合数学
    【单调队列优化】[CF372C] Watching Fireworks is Fun
    【线段树】[Luogu P4198]楼房修建
    Python资源
    人生的几个阶段
    两种解读,生活的意义和方法
  • 原文地址:https://www.cnblogs.com/zy1120192493/p/13295040.html
Copyright © 2011-2022 走看看