• 第40讲:类和对象——一些相关的BIF


    一 相关的内置函数BIF

    1 issubclass()方法

    • 功能:用于判断参数 class 是否是类型参数 classinfo 的子类。
    • 语法:
      issubclass(class, classinfo)
    • 参数:
      • class -- 类。
      • classinfo -- 类。
    • 返回值:如果 class 是 classinfo 的子类返回 True,否则返回 False。
    • 需要注意的点:
      • 一个类是自身的子类,检查并不严谨
      • classinfo可以是类对象组成的元组,只要class是其中任何一个类的子类,则返回True

    2 isinstance()方法

    • 功能:检查一个实例对象是否属于一个类,类似于type(),他们两个的区别如下:
      • type() 不会认为子类是一种父类类型,不考虑继承关系。
      • isinstance() 会认为子类是一种父类类型,考虑继承关系。
      • 如果要判断两个类型是否相同推荐使用 isinstance()。
    • 语法:
      isinstance(object, classinfo)
    • 参数:
      • object -- 实例对象。
        • 如果给出的object参数不是对象类型,则永远返回False
      • classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
        • 如果classinfo参数不是上述类型,则会抛出一个TypeError异常
    • 返回值:如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。

    3 hasattr()方法

    • 功能:用于判断对象是否包含对应的属性。
    • 语法;
      hasattr(object, name)
    • 参数
      • object -- 对象。
      • name -- 字符串,属性名。属性名要用引号引起来
    • 返回值:如果对象有该属性返回 True,否则返回 False。

    4 getattr()方法

    • 功能:用于返回一个对象属性值。
    • 语法:
      getattr(object, name[, default])
    • 参数:
      • object -- 对象。
      • name -- 字符串,对象属性。
      • default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
    • 返回值:返回对象属性值。

    5 setattr()方法

    • 功能:对应函数 getattr(),用于设置属性值,该属性不一定是存在的。
    • 语法:
      setattr(object, name, value)
    • 参数:
      • object -- 对象。
      • name -- 字符串,对象属性。
      • value -- 属性值。
    • 返回值:无

    6 delattr()方法

    • 功能:用于删除属性。被删除的属性不存在会抛出AttributeError异常
    • 语法:
      delattr(object, name)
    • 参数:
      • object -- 对象。
      • name -- 必须是对象的属性。
    • 返回值:无

    7 property()方法

    • 功能:property() 函数的作用是在新式类中返回属性值。(设置一个属性,该属性的作用是去设置定义好的属性)
    • 语法:
      class property([fget[, fset[, fdel[, doc]]]])
    • 参数:
      • fget -- 获取属性值的函数,需要在类中自己定义方法的内容
      • fset -- 设置属性值的函数
      • fdel -- 删除属性值函数
      • doc -- 属性描述信息
    • 返回值:返回新式类的属性
    • 举例:
       1 >>> class C:
       2 ...     def __init__(self,size=10):
       3 ...             self.size = size
       4 ...     def getSize(self):
       5 ...             return self.size
       6 ...     def setSize(self,value):
       7 ...             self.size = value
       8 ...     def delSize(self):
       9 ...             del self.size
      10 ...     x = property(getSize,setSize,delSize)
      11 ...
      12 >>> c1 = C()
      13 >>> c1.getSize()
      14 10
      15 >>> c1.x
      16 10
      17 >>> c1.x = 18
      18 >>> c1.x
      19 18
      20 >>> c1.getSize()
      21 18
      22 >>> del c1.x
      23 >>> c1.getSize()
      24 Traceback (most recent call last):
      25   File "<stdin>", line 1, in <module>
      26   File "<stdin>", line 5, in getSize
      27 AttributeError: 'C' object has no attribute 'size'
      property()方法

    二 课后习题

    0. 如何判断一个类是否为另一个类的子类?
    答:使用 issubclass(class, classinfo) 函数,如果第一个参数(class)是第二个参数(classinfo)的一个子类,则返回 True,否则返回 False。
    另外以下这些常识你应该知道:

    • 一个类被认为是其自身的子类
    • classinfo 可以是类对象组成的元祖,只要 class 与其中任何一个候选类的子类,则返回 True
    • 在其他情况下,会抛出一个 TypeError 异常


    1. 如何判断对象 a 是否为 类 A 的实例对象?
    答:使用 isinstance(object, classinfo) 函数,如果第一个参数(object)是第二个参数(classinfo)的实例对象,则返回 True,否则返回 False。I
    另外以下这些常识你应该知道:

    • 如果 objec t是 classinfo 的子类的一个实例,也符合条件
    • 如果第一个参数不是对象,则永远返回False
    • classinfo 可以是类对象组成的元祖,只要class与其中任何一个候选类的子类,则返回 True
    • 如果第二个参数不是类或者由类对象组成的元祖,会抛出一个 TypeError 异常


    2. 如何优雅地避免访问对象不存在的属性(不产生异常)?
    答:有两种方法可以做到。
    第一种先使用 hasattr(object, name) 函数判断属性是否存在,如果存在再访问(第一个参数(object)是对象,第二个参数(name)是属性名的字符串形式);
    第二种方法是直接使用 getattr(object, name[, default]) 函数并设置 default 参数(返回对象指定的属性值,如果指定的属性不存在,返回default(可选参数)的值)。

    3. Python 的一些 BIF 很奇怪,但却十分有用。请问 property() 函数的作用是什么?

    答:property() 函数允许编程人员轻松、有效地管理属性访问。scB?J

    4. 请补充以下代码,使程序可以正常运行:

     1 class C:
     2     def __init__(self, size=10):
     3         self.size = size
     4     def getXSize(self):
     5         return self.size
     6     def setXSize(self, value):
     7         self.size = value
     8     def delXSize(self):
     9         del self.size
    10         # 此处应该补充一句代码,程序才能正常运行
    11 >>> c = C()
    12 >>> c.x
    13 10
    14 >>> c.x = 12
    15 >>> c.x
    16 12

    答:x = property(getXSize, setXSize, delXSize)


    5. 通过自学【扩展阅读】Python 函数修饰符(装饰器)的使用,使用修饰符修改以下代码。
    代码A:

    1 class CodeA:
    2     def foo():
    3         print("调用静态方法 foo()")
    4         # 将 foo() 方法设置为静态方法
    5         foo = staticmethod(foo)

    代码B:P%34d?|Bc

    1 class CodeB:
    2     def foo(cls):
    3         print("调用类方法 foo()")
    4         # 将 foo() 方法设置为类方法
    5         foo = classmethod(foo)


    答:其实正是因为设置静态方法和类方法过于讨人吐槽,因此 Python 的作者才开发出了函数修饰符的形式替代。
    代码A:

    1 class CodeA:
    2         @staticmethod
    3     def foo():
    4         print("调用静态方法 foo()")

    代码B:- SI?C&].r

     
    1 class CodeB:
    2         @classmethod
    3     def foo(cls):
    4         print("调用类方法 foo()")


    6. 你真的理解了修饰符的用法吗?那请你写出以下代码没有用上修饰符的等同形式:[dm,PQH5&

    1 @something
    2 def f():
    3     print("I love FishC.com!")

    答:其实 Python 的修饰符就是一种优雅的封装,但要注意的是只可以在模块或类定义内对函数进行修饰,不允许修饰一个类。
    一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。

    1 @something
    2 def f():
    3     print("I love FishC.com!")
    4 # 相当于
    5 def f():
    6     print("I love FishC.com!")
    7 f = something(f)

    7. 通过自学【扩展阅读】property 的详细使用方法,将第 4 题的代码修改为“使用属性修饰符创建描述符”的方式实现。
    答:可能你还没听说过描述符(这个概念在你学完接下来的几节课自然会了解),但这一点都影响聪明的你修改这个程序.

     1 class C:
     2     def __init__(self, size=10):
     3         self.size = size
     4         
     5     @property
     6     def x(self):
     7         return self.size
     8     @x.setter
     9     def x(self, value):
    10         self.size = value
    11     @x.deleter
    12     def x(self):
    13         del self.size
  • 相关阅读:
    多线程——newFixedThreadPool线程池
    mysql SQL优化之嵌套查询-遁地龙卷风
    mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风
    mysql存储过程编写-入门案例-遁地龙卷风
    编程轶事-java中的null-遁地龙卷风
    正逆向思维-编程轶事-遁地龙卷风
    MyBatis处理一行数据-MyBatis使用sum语句报错-MyBatis字段映射-遁地龙卷风
    MyBatis框架在控制台打印Sql语句-遁地龙卷风
    3d转换-正方体-Html5Css3-遁地龙卷风
    突破瓶颈-遁地龙卷风
  • 原文地址:https://www.cnblogs.com/luoxun/p/13562588.html
Copyright © 2020-2023  润新知