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

   日期:2024-01-17     浏览:43    评论:0    

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

 

 

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

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服