Python学习笔记--super方法、类方法、静态方法

目录

super方法

类方法

静态方法


super方法

1. super方法用于获取父类的代理对象,以执行已在子类中被重写的父类方法.

其语法格式为:

super([类名[,对象名或类名]])

super方法有两个参数:

第一个参数是要获取父类代理对象的类名

第二个参数如果传入对象名,则该对象所属的类必须是第一个参数指定的类或该类的子类,找到的父类对象的self会绑定到这个对象上;如果传入类名,则该类必须是第一个参数指定的类的子类。

在一个类A的定义中调用super方法时,可以将两个参数都省略,此 时,super()等价于super(A, self),即获取A的父类代理对象,且获取 到的父类代理对象中的self绑定到当前A类对象的self上。

示例

class Person: #定义Person类
    def __init__(self, name): #定义构造方法
        print('Person类构造方法被调用!')
        self.name=name #将self对象的name属性赋为形参name的值

class Student(Person): #以Person类作为父类定义子类Student
    def __init__(self, sno, name): #定义构造方法
        print('Student类构造方法被调用!')
        super().__init__(name) #调用父类的构造方法
        self.sno=sno #将self对象的sno属性赋为形参sno的值

class Postgraduate(Student): #以Student类作为父类定义子类Postgraduate
    def __init__(self, sno, name, tutor): #定义构造方法
        print('Postgraduate类构造方法被调用!')
        super().__init__(sno, name) #调用父类的构造方法
        self.tutor=tutor #将self对象的tutor属性赋为形参tutor的值

if __name__=='__main__':
    pg=Postgraduate('1810100','李晓明','马红') #创建Postgraduate类对象pg
    print('学号:%s,姓名:%s,导师:%s'%(pg.sno,pg.name,pg.tutor))

# 输出
'''
Postgraduate类构造方法被调用!
Student类构造方法被调用!
Person类构造方法被调用!
学号:1810100,姓名:李晓明,导师:马红
'''

1、用于获取父类代理对象的方法是(    )。

A.parent

B.proxy

C.delegate

D.super

正确答案:D

解析:使用super方法可以在子类中获取父类代理对象,从而可以根据该代理对象调用被重写的父类方法。

2、使用获取到的父类代理对象可以在子类中调用被重写的父类方法。

A.正确

B.错误

正确答案:A

类方法

类方法是指使用 @classmethod修饰的方 法,其第一个参数是类 本身(而不是类的实例对象)。
类方法的特点是既可以通过类名直接调用, 也可以通过类的实例对象调用。

示例

class Complex:
    def __init__(self, real=0, image=0):
        self.real = real
        self.image = image

    @classmethod
    def add(cls, c1, c2):
        print(cls)
        c = Complex()
        c.real = c1.real + c2.real
        c.image = c1.image + c2.image
        return c

if __name__ == '__main__':
    c1 = Complex(1, 2.5)
    c2 = Complex(2.2, 3.1)
    c = Complex.add(c1, c2)  #直接使用类名调用类方法add
    print("c1+c2的结果为%.2f+%.2fi"%(c.real, c.image))

# 输出
'''
<class '__main__.Complex'>
c1+c2的结果为3.20+5.60i
'''

 注:将“ c=Complex.add(c1,c2) ”改为“ c=c1.add(c1, c2) ”或 “ c=c2.add(c1, c2)”或“ c=Complex().add(c1, c2) ” ,程序运行后可得到相同的输出结果,即类方法也可以使用实例对象调用。

通过“ print(cls) ”输出类方法add的第一个参数,从输出结果中可以看到clsComplex类。

1. 判断

如果使用类的实例对象调用类方法,则类方法中的第一个参数指向该实例对象。

A.正确

B.错误

正确答案:B

解析:类方法的第一个参数对应调用该方法时所使用的类。即便通过对象调用类方法,也是将该对象所属的类传给类方法的第一个参数。

静态方法

静态方法是指使用@staticmethod修饰的方法。

与类方法相同,静态方法既可以直接通过类名调用,也可以通过类的实例对象调用。

与类方法不同的地方在于,静态方法中没有类方法中的第一个类参数。

示例

class Complex1:
    def __init__(self, real=0, image=0):
        self.real = real
        self.image = image

    @staticmethod
    def add(c1, c2):
        c = Complex()
        c.real = c1.real + c2.real
        c.image = c1.image + c2.image
        return c

if __name__ == '__main__':
    c1 = Complex1(1, 2.5)
    c2 = Complex1(2.2, 3.1)
    c = Complex1.add(c1, c2)  #直接使用类名调用类方法add
    print("c1+c2的结果为%.2f+%.2fi"%(c.real, c.image))

# 输出
'''
c1+c2的结果为3.20+5.60i
'''
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值