序号(后面举例用) | 类型 | 举例 | 作用说明 |
1 | 前单下划线 | _var |
★★ 命名约定为私有属性、方法,但不会强制执行(报错),只是作为提示. 经常用于property语法中. |
2 | 后单下划线 | var_ |
★ 避免与关键字冲突,又让变量名具有可读性. 举例:加入想用type = "ok" ,但type是关键字,这时候就用type_ = "ok",增加了变量但可读性,又不与关键字冲突. |
3 | 双前下划线 | __var |
★★★ 双下划线的变量、方法不能直接被实例调用(网上很多把这当私有化使用) 用来避免子类覆盖其内容(如果不理解,请看下面的示例代码). |
4 | 双前和双后下划线 | __var__ |
★★★ 1. 这是python的魔法,不要去调用这些变量和方法. 举例:__init__ __len__ __new__,调用方式 len(var) 2. 或者你重写这些内置方法(如果不理解,请看下面的示例代码). 建议: 尽量避免用此方法命名自己的变量和方法,免得和将来python的内置方法冲突. |
5 | 单下划线 | _ |
★ 临时变量,接收值后抛弃(功能和go的单下划线一样). |
序号3的示例代码:
1 # 序号3的代码示例 2 # 此时类A 和 类B 都写了__method方法,但因为用了双下划线,虽然B重写了方法,但没有生效。这就是双下划线的作用; 3 class A(object): 4 def __method(self): 5 print("I'm a method in A") 6 def method(self): 7 self.__method() 8 9 class B(A): 10 def __method(self): 11 print("I'm a method in B") 12 13 if __name__ == "__main__": 14 a = A() 15 a.method() 16 b = B() 17 b.method() 18 # 执行结果: 19 ''' 20 I'm a method in A 21 I'm a method in A 22 ''' 23 24 25 # 虽然上面写了__的一个示例,但下面但代码也很特别,请看下 26 class A(object): 27 def __method(self): 28 print("I'm a method in A") 29 def method(self): 30 self.__method() 31 32 class B(A): 33 def __method(self): 34 print("I'm a method in B") 35 def method(self): 36 self.__method() 37 38 if __name__ == "__main__": 39 a = A() 40 a.method() 41 b = B() 42 b.method() 43 # 执行结果: 44 ''' 45 I'm a method in A 46 I'm a method in B 47 '''
序号4的示例代码:
1 # 序号4的代码示例 2 # 重写__var__的方法 3 class CrazyNumber(object): 4 def __init__(self, n): 5 self.n = n 6 def __add__(self, other): 7 return self.n + other 8 def __sub__(self, other): 9 return self.n - other 10 def __str__(self): 11 return str(self.n) 12 13 if __name__ == "__main__": 14 num = CrazyNumber(10) 15 print(num) # 10 16 print(num + 5) # 15 17 print(num - 20) # -10
1 class Person(object): 2 def __init__(self): 3 self.__name = "wang" 4 self.__age__ = 30 5 6 if __name__ == "__main__": 7 p = Person() 8 print(p.__name) # 报错 9 print(p.__age__) # 30