Python 常见双下划线关键字的用法

1.__init__

__init__ 方法通常用在初始化一个类实例的时候,例如:

class Person(object):

      def __init__(self, name, age):

      self.name = name

      self.age = age

2.__str__

__str__用来返回对象的字符串表达式。例如:

class Person(object):

     def __init__(self, name):

          super(Person, self).__init__()

          self.name = name

    def __str__(self):

         return'Hola,%s' % self.name

lina = Person('Lina')

print(lina)

在我们编写一个新的Python类的时候,总是在最开始位置写一个初始化方法__init__,以便初始化对象,然后会写一个__str__方法,方面我们调试程序。

3.__new__

__new__方法的调用是发生在__init__之前的

class Person(object):


     def __new__(cls,*args, **kwargs):

          print('new called')

          return object.__new__(cls)

     def __init__(self, name):

          print('init called')

          super(Person, self).__init__()

          self.name = name

     def __str__(self):

          return'Hola,%s' % self.name

lina = Person('Lina')

print(lina)

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

__init__ 和 __new__ 最主要的区别在于:

1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。

2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。

__new__ 的作用

依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。

4.__name__和__main__

为了区分 主执行代码和被调用文件,python引入了变量:__name__。__name__就是标识模块的名字的一个系统变量。这里分两种情况:假如当前模块是主模块(也就是调用其他模块的模块),那么此模块名字就是__main__,通过if判断这样就可以执行“__mian__:”后面的主函数内容;假如此模块是被import的,则此模块名字为文件名字(不加后面的.py),通过if判断这样就会跳过“__mian__:”后面的内容。

5.__slots__

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性。比如,只允许对Student实例添加name和age属性:

class Student(object):

__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,064评论 19 139
  • 教程地址:python进阶 - 慕课网 python函数式编程 变量可以指向函数: f = absprint(f)...
    竹口小生阅读 3,730评论 0 2
  • 基础1.r''表示''内部的字符串默认不转义2.'''...'''表示多行内容3. 布尔值:True、False(...
    neo已经被使用阅读 5,747评论 0 5
  • 有意在这个城市多停留了一晚,在陌生又似曾相识的丝丝氛围中,设想另一种可能性。可能性缓缓地从周围风物渗透出来...
    nyofarya阅读 1,661评论 2 1
  • 今日如常 洗澡后午夜外出寻宵夜 散步 以解久坐腹部胀气之不适 因今日习惯酸奶饼干 恰想换个口味 便从住所向外头...
    Kislyl阅读 1,459评论 0 0

友情链接更多精彩内容