【从C#走进Python】三、变量声明

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

类里的方法声明当中,默认第一个传入参数就是实例对象,

这个语法糖叫点语法(dot syntax):

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

 

 

  命名规则:C#习惯使用骆峰法,Python惯常用蛇形法

命名法

骆峰命名法

(camel case)

示例:

userName(临时变量)

_userName(私有变量)

UserName(公开变量)

以大小写区分单词隔开,行距紧凑

蛇形命名法

(snake case)

示例:

user_name

下划线拉大词距,全小写无需切换

Tips:

  在python编程中,可以结合两种命名方式,

  不过在包名、模块名、方法名、普通变量名中,更推荐用蛇形命名法

 

 

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

 

你可能感兴趣的:(【从C#走进Python】三、变量声明)