描述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'>

 

 

 吐槽:感觉写短一点阅读效果好些?~

 

文章来源于网络,如有侵权请联系站长QQ61910465删除
本文版权归趣快排营销www.seoguRubloG.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系✚Qq61910465