第1关:类的内建函数

任务描述
hasattr()、getattr()、setattr()、delattr()
dir()
super()
编程要求
测试说明
任务描述
对于类、实例和其它对象而言,存在着一些内建函数,这些内建函数无需定义,可直接调用。本关的任务就是让学习者掌握并能使用这些内建函数。
相关知识
issubclass()
issubclass()是一个布尔函数,这个函数用来判断一个类是否是另外一个类的子类或者子孙类。如果给出的子类确实是给出的父类的子类,则返回True,否则返回False。它的语法如下:

issubclass(subclass, parentclass)
parentclass也可以是一个包含若干个父类的元组,只要子类属于元组中某一个父类,则返回True,否则返回False。
isinstance()
isinstance()是一个布尔函数,这个函数用来判断一个对象是否是给定类的实例。若是给定类的实例或是给定类的子类的实例,则返回True,否则返回False。它的语法如下:

isinstance(object,class)
hasattr()、getattr()、setattr()、delattr()
这几个函数可以在各种对象下工作,不限于类和实例。

(1)hasattr(); hasattr()是布尔型的,它用于判断一个对象是否有一个特定的属性,一般用于在调用某个属性前检查属性是否存在。例如:

class testClass(object):
  foo = 100
  def __init__(self,name):
      self.name = name
test = testClass('theName')
print(hasattr(test,'name'))
print(hasattr(testClass,'foo'))

结果为:

True
True
(2)getattr()、setattr(); getattr()是用来获取对象的属性或者方法。若返回的是对象,则返回对象的值,若返回的是对象的方法,则返回方法的内存地址。setattr()是用来给对象的属性赋值。若属性不存在,就先创建属性然后再赋值。例如:

class testClass(object):
  foo = 100
  def __init__(self,name):
      self.name = name
test = testClass('theName')
setattr(test,'fool','200')
setattr(test,'foo','50')
print(getattr(test,'fool'))
print(getattr(test,'foo'))

结果为:
200
50
(3) delattr()。 delattr()是用来从一个对象中删除属性。
dir()
作用在实例上时,显示实例变量、实例所在的类、基类中定义的方法和属性;
作用在类上时,显示类与它的基类的__dict__内容;
作用在模块上时,显示此模块的__dict__内容;
dir()不带参数时,显示调用者的局部变量。
例如:

class testClass(object):
    foo = 100
    def __init__(self,name):
        self.name = name
test = testClass('theName')
print(dir(test))

结果为:

[‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’, ‘foo’, ‘fool’, ‘name’]
super()
super()函数的作用就是找出相应的类的父类,然后调用父类的方法与属性。例如:

class parentClass:
    def __init__(self):
        self.name = "parent"
    def tell(self):
        print("this is parentClass")
class subClass(parentClass):
    def tell(self):
        print("this is subClass")
        parentClass.tell(self)
sc = subClass()
sc.tell()

结果为:

this is subClass
this is parentClass
在这个示例中,我们在调用父类的方法时是通过非绑定的方式调用,这样的调用方式增大了代码的耦合性。如果我们要修改subClass的父类,则在子类的调用中也要修改相应代码。如果代码量庞大的话,这个工作几乎很难完成,所以我们采用super方法。例如:

class parentClass:
    def __init__(self):
        self.name = "parent"
    def tell(self):
        print("this is parentClass")
class subClass(parentClass):
    def tell(self):
        print("this is subClass")
        super(subClass,self).tell()
sc = subClass()
sc.tell()

结果为:

this is subClass
this is parentClass
上面的例子中,我们将寻找父类的任务交给子类,这样既可保证代码的安全,修改起来也很方便。
#####vars()
vars()是用来返回对象的属性及其值的一个字典。如果没有给出对象,则返回当前调用位置的属性和属性值。

如果您想了解更多类的内建函数的相关知识,请参考:[美] Wesley J.Chun 著《 Python 核心编程》附录 B.13。

编程要求
本关的测试文件中给出了两个类:parentClass与subClass。subClass为parentClass的子类,parentClass类中存在属性name与方法tell(),subClass类中存在方法tell()。

本关的编程任务是补全specialmethod.py文件中的代码,具体要求如下:

填入判断subClass是否为parentClass的子类的代码,并输出结果;
填入判断sc是否为subClass实例的代码,并输出结果;
填入判断实例sc是否包含一个属性为name的代码,并输出结果;
填入将sc的属性name的值设置为subclass的代码;
填入获取sc的属性name的值的代码,并输出结果;
填入调用subClass的父类的tell()方法的代码。
本关涉及的代码文件src/step1/specialmethod.py的代码框架如下:

import specialmethodtest
sc = specialmethodtest.subClass()
# 请在下面填入判断subClass是否为parentClass的子类的代码,并输出结果
########## Begin ##########
########## End ##########
# 请在下面填入判断sc是否为subClass实例的代码,并输出结果
########## Begin ##########
########## End ##########
# 请在下面填入判断实例sc是否包含一个属性为name的代码,并输出结果
########## Begin ##########
########## End ##########
# 请在下面填入将sc的属性name的值设置为subclass的代码
########## Begin ##########
########## End ##########
# 请在下面填入获取sc的属性name的值的代码,并输出结果
########## Begin ##########
########## End ##########
# 请在下面填入调用subClass的父类的tell()方法的代码
########## Begin ##########
########## End ##########

测试说明
本文的测试文件是specialmethod.py,具体测试过程如下:

平台自动编译生成specialmethod.exe;
平台运行specialmethod.exe,并以标准输入方式提供测试输入;
平台获取specialmethod.exe输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/step1/specialmethod.py的样例测试集:
预期输入:


预期输出:

True
True
True
subclass
this is parentClass
开始你的任务吧,祝你成功!

我的代码:

import specialmethodtest
sc = specialmethodtest.subClass()
# 请在下面填入判断subClass是否为parentClass的子类的代码,并输出结果
########## Begin ##########
print(issubclass(specialmethodtest.subClass,specialmethodtest.parentClass))
########## End ##########
# 请在下面填入判断sc是否为subClass实例的代码,并输出结果
########## Begin ##########
print(isinstance(sc,specialmethodtest.subClass))
########## End ##########
# 请在下面填入判断实例sc是否包含一个属性为name的代码,并输出结果
########## Begin ##########
print(hasattr(sc,'name'))
########## End ##########
# 请在下面填入将sc的属性name的值设置为subclass的代码
########## Begin ##########
setattr(sc,'name','subclass')
########## End ##########
# 请在下面填入获取sc的属性name的值的代码,并输出结果
########## Begin ##########
print(getattr(sc,'name'))
########## End ##########
# 请在下面填入调用subClass的父类的tell()方法的代码
########## Begin ##########
specialmethodtest.parentClass.tell(sc)
########## End ##########
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别是个逗比吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值