zoukankan      html  css  js  c++  java
  • 【从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编程中,可以结合两种命名方式,

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

     

     

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

     

  • 相关阅读:
    My first blog in cnblog
    浅析JavaScript中this储存
    input 文本框密码框的只读属性
    Js 数组——filter()、map()、some()、every()、forEach()、lastIndexOf()、indexOf()
    jquery使用$.getJson()跨域大数据量请求方法
    JS中关于clientWidth offsetWidth scrollWidth 等的含义及区别
    JS性能优化
    npm 创建 node.js 项目
    css 垂直居中的几种方法
    字符串转数组
  • 原文地址:https://www.cnblogs.com/carmen-019/p/13290899.html
Copyright © 2011-2022 走看看