1.14类代码编写基础

2020-06-08  本文已影响0人  Benedict清水

一、类对象和实例对象

在python对象模型中,类和通过类产生的实例是两种不同的对象类型:

二、类对象提供默认行为

当我们执行class语句时,就会得到类对象。

三、实例对象是具体的元素

当调用类对象时,我们得到了实例对象。

四、类代码编写的细节

  1. class语句
    class语句是复合语句,其缩进语句的主体一般出现在头部行下边。在头部行中,父类列在类名称之后的括号内,由逗号相隔。
class name(superclass):
    attr = value
    def method(self,...):
        self.attr = value

在class语句内,任何赋值语句都会产生类属性,而且还有特殊名称方法重载运算符。例如,如果定义了名为_init_的构造函数就会在实例对象创建时调用。

  1. 属性
    把简单的非函数的对象赋值给类属性,就会产生被所有实例共享的数据属性。
>>> class ShareData:
...     spam = 42
...
>>> x = ShareData()
>>> y = ShareData()
>>> x.spam,y.spam
(42, 42)

由于名称spam是在class语句的顶层被赋值,因此会附加在这个类中,从而为所有的实例共享。我们可通过类名称修改它,或者是通过实例或者类引用它。

>>> SharedData.spam = 99
>>> ShareData.spam = 99
>>> x.spam,y.spam,ShareData.spam
(99, 99, 99)

我们通过使用实例来给spam赋值会发生什么?

>>> x.spam = 88
>>> x.spam,y.spam,ShareData.spam
(88, 99, 99)

对实例的属性进行赋值运算就会在改实例内创建或者修改名称,而不是在共享的类中。当附加在类上时,名称是共享的,当附加在实例上时,名称则是属于每个实例的数据,而不是共享的行为数据。

  1. 方法
    方法是位于class语句的主体内,由def语句创建的函数对象。方法的工作方式与简单的函数完全一致,只是有一个重要的差异:方法的第一位参数总是接受方法调用的隐含主体,也就是当前的实例对象。python会自动把实例方法的调用映射为类的方法函数。
    方法调用需要通过实例:
instance.method(args...)

这会被自动翻译成以下形式的类方法函数调用:

class.method(instance,args...)
class NextClass:
    def printer(self, text):
        self.message = text
        print(self.meessage)

printer引用了一个函数对象。因为它是在class语句的作用域中赋值的,所以会变成类对象的属性,这个类创建的每个实例都会继承这个属性。

>>> x = NextClass()
>>> x.printer('instance call')
instance call
>>> x.message
'instance call'

当对实例进行点号运算来调用它时,printer会先通过继承进行定位,然后它的self参数会自动赋值为实例对象(即x)。text参数会得到在调用时传入的字符串('instance call')。
类本身调用:

>>> NextClass.printer(x, 'class call')
class call
>>> x.message
'class call'
上一篇 下一篇

猜你喜欢

热点阅读