描述Python的变量声明,可觑其语言设计思路,实现更快地代码阅读。
变量声明 |
|
C# |
|
public、protect、private、internal |
明确指出适用范围 (完全公开、子类可访问、仅自己可访问、程序集内可访问) |
Python |
|
有点神奇,没有不能访问的变量,一般通过“潜规则”暗示其私有性 Tips:下划线underline,双下划线在一些论坛里面就是double underline,简称dunder |
|
_var |
程序员潜规则,这是个私有变量,访问改写慎重 |
_funName 使用通配符导入(from myModule import * ),不可见 通配符导入模块,不会导入单下划线的名称,除非重写__all__ 使用名字导入(import myModule),可见 |
|
var_ |
避免和python解释器的关键词相撞的词,例如class_ |
__var |
允许父类与子类有相同的名字并且相互独立(子类该属性不覆盖父类) >>> class father: ... def __init__(self): ... self.__name = 'ff' ... self._test = 't' ... >>> class son(father): ... def __init__(self): ... super().__init__() ... self.__name = 'ss' ... self._id = '1' ... >>> s = son() >>> dir(s) ['__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__', '_father__name', '_id', '_son__name', '_test'] 名称被改写了,其实是为了防止被子类覆盖。 (前双划线改写名字适用于属性与方法) |
这种前dunder改写名字的特性,不受类束缚: >>> _MangledGobal__mangled = 11 >>> class MangledGobal(): ... def test(self): ... return __mangled ... >>> MangledGobal().test() 11 目前感觉隐藏坑还是有些多 |
|
__var__ |
解释器内置方法,程序员应该避免这种命名 (以免与已有或者未来会有的内置方法相撞) |
_ |
临时变量(用完就丢的意思) 在交互窗口中表示上一个语句的结果 |
self |
常见词,以前我以为它就是C#里this的意思,虽然它也确实是; 但C#的this是固定(一个字母都不能变动)的关键词, Python当中self可以不叫self,随你起名(按照潜规则来说当然还是叫self稳妥),它只要在类的方法声明中占据第一个参数位置就可以。 >>> class test: ... def __init__(dogee): ... dogee.name = 'dog' ... >>> test().name 'dog' 类里的方法声明当中,默认第一个传入参数就是实例对象,因为这个语法糖设计: >>> class test: ... def __init__(dogee): ... dogee.name = 'dog' ... def printName(doge): ... print(doge.name) ... >>> t = test() >>> test.printName(t) dog 这个语法糖看似鸡肋,但从这个设计上就能明白self的设定。 注意,编程约定实例方法第一个入参是self |
cls |
类型本身也是一种对象,cls表示类型; 例如类方法,它的首个入参就不是实例对象,而是类对象: >>> class test: ... def __init__(dogee): ... dogee.name = 'dog' ... @classmethod ... def classMethod(cls): ... print(f'class method called, cls: {cls}') >>> test.classMethod() class method called, cls: <class '__main__.test'> >>> test().classMethod() class method called, cls: <class '__main__.test'>
|
吐槽:感觉写短一点阅读效果好些?~