《Python高级编程》学习心得——第二&三章

《Python高级编程》学习心得——第二&三章

第二章、一切皆对象

理论

《Python高级编程》学习心得——第二&三章_第1张图片

Python中一切皆对象,上图给出了根本性的阐释。具体而言,对象有id类型,和三大要素。不妨与Java对比分析Python“一切皆对象”的设计理念:

  • 与Java一样,Python中的类也都是继承于同一个基类。在Java中,这个基类是Object,而在Python中,这个基类是object[1]

  • 与Java不同的是,Python里对象的类型(即Python内置类型或程序员用class关键字定义的类)也是对象,这些对象是type类的实例[2]

  • 那么我们来考查type,根据[1],type类继承object类;根据[2],object和type都是type类的实例,所以type对象是type类的实例。

综上,正是通过type类和type对象自己实例化自己的回环,Python实现了“一切皆对象”。

代码

这一章用的Python语法有:

  • 类.__bases__返回类的父类元组(可能有多重继承)
  • type(对象)返回对象的类型

下面是一些例子

>>> type(list)
<class 'type'>
>>> list.__bases__
(<class 'object'>,)
>>> type(object)
<class 'type'>
>>> object.__bases__
()
>>> type(type)
<class 'type'>
>>> type.__bases__
(<class 'object'>,)

第三章、魔法函数

魔法函数没有特别抽象的理论,所以就直接上代码和例子吧。

dir(类)会返回类的所有属性和方法,比如dir(object)会看到一些魔法函数

dir(object)
Out[1]: 
['__class__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__']

举例来说,__eq__, __ge__, __gt__是比较运算,__repr__和__str__决定了对象的输出方式。

下面以__len__和__str__为例讲解魔法函数的使用。

  • __len__:如果一个类实现了__len__方法用于计算对象的长度,则可以用len(该类的对象)来获得该类对象的长度(当然也可以用 该类对象.__len__()来计算,两者是等价的)

    class A:
        def __init__(self, a=(1,2,3)):
            self.content = a
            
        def __len__(self):
            return len(self.content)
        
    
    a = A((1,3,4,5))
    
    len(a)
    Out[6]: 4
    
    a.__len__()
    Out[7]: 4
    
  • __str__:类似Java里重写toString方法,Python里的print(对象)语句实际上会执行print(对象.__str__())

    class Point:
        def __init__(self, x, y):
            self.x = x
            self.y = y
            
        def __str__(self):
            return 'x:{}, y:{}'.format(self.x, self.y)
        
    
    p = Point(1, 3)
    
    print(p)
    x:1, y:3	
            
    print(p.__str__())
    x:1, y:3
    

你可能感兴趣的:(Python)