zoukankan      html  css  js  c++  java
  • python学习笔记二

    1.python中的几种变量

    1)__x 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

    双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量

    2) __x__需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。

    3) _x有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

    2.python中几种特殊的函数

      __func表示不希望外部访问,但是事实上也可以访问,这体现了python的设计哲学,只提供建议,一切全靠自觉。

          __func__是可以被重写的函数,被其他函数隐式调用,这些实际上是用来定制类的方法

      __len__ len()其实调用了__len__

    __str__被print隐式调用

    __repr__ 直接显示变量时候调用,(两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的)

    __iter__ 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。(通常也需要重写next方法)

    __getitem__ 要表现得像list那样按照下标取出元素,需要实现__getitem__()方法

    _setitem__()方法,把对象视作list或dict来对集合赋值。最后,还有一个__delitem__()方法,用于删除某个元素

      __slot__用来限制类可以添加的属性

    Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性。使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的。除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__

    __getattr__ 正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。要避免这个错误,除了可以加原来没有的属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性。只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如name,不会在__getattr__中查找。

    __call__ 只需要定义一个__call__()方法,就可以直接对实例进行调用,__call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call()__的类实例

    1)type()判断对象类型

    2)isinstance()判断对象类型,判断是否继承子某个父类

    3)dir() 如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list

    4) help()获得对象的详细信息

    仅仅把属性和方法列出来是不够的,配合getattr()setattr()以及hasattr(),还可以直接操作一个对象的状态,这些优点类似于其他高级语言中的反射

    5)Python内置的@property装饰器就是负责把一个方法变成属性调用的,多用于getter,与之对应的是@属性.setter

     

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/4151975.html
Copyright © 2011-2022 走看看