• 用class定义类--Python


    Python使用class创建对象。没个定义的类都有一个特殊的方法,名为__init__(),可以通过这个方法控制如何初始化对象。

    定义类的基本形式:

    class Athlete:
        def __init__(self):
            #The code to initialize a "Athlete" object.
                ......

    创建对象实例:有了类之后,创建对象实例很容易。只需将对类名的调用赋至各个变量。通过

    这种方式,类(以及__init__()方法)提供了一种机制,允许你创建一个定制的工厂函数,

    用来根据需要创建多个对象实例。与C++系列语言不同,Python中没有定义构造函数“new”

    的概念。Python会为你完成对象构建,然后可以使用__init__()方法定制对象的初始状态。

    self的重要性

    定义一个类时,实际上是在定义一个定制工厂函数,然后可以在你的代码中使用这个工厂函数

    创建实例,即:

    a = Athlete()
    Athlete().__init__(a)
    ____________________________________________________
    Athlete为类名,__init__为方法名,a为对象实例的目标标识符。

    在类中定义__init__()方法:

    def __init__(self):
        # The code to initialize an "Athlete" object.
           ......

    每个方法的第一个参数都是self

    实际上,不仅__init__()方法需要self作为它的第一个参数,类中定义的所有其他方法也是如此。

    Python要求每个方法的第一个参数为调用对象实例。下面扩展这个实例类,在一个名为thing的对象

    属性中存储一个值,具体值在初始化时设置。另外还要扩充一个方法,名为how_big(),它会利用len()

    BIF返回thing的长度:

    class Athlete:
        def __init__(self, value=0):
            self.thing = value
        def how_big(self):
            return(len(self.thing))
    ---------------------------------------------------------------
    现在“初始化”代码将所提供的一个值赋至一个名为“self.thing”的
    类属性。
    how_big() 方法返回“self.thing”的长度。

    在一个对象实例上调用类方法时,Python要求第一个参数是调用对象实例,这往往赋至各个方法的self参数。

    只凭这一点就足以解释为什么self如此重要,也可以由此说明编写对象方法时为什么所有对象方法的第一个参

    数必须是self。

     继承Python内置的list

    Python的class允许你从零开始创建一个定制类,就像创建Athlete类那样。不过,class还允许通过继承现有的

    其他类来创建一个类,这也包括list,set和dict提供的Python内置数据结构类。通过继承创建的这些类称为子类。

    class NameList(list):
        def __init__(self, a_name):
            list.__init__([])
            self.name = a_name
    定义了NameList类之后,用它创建一个对象实例,检查对象类型(使用type()BIF),看看它会提供什么内容(使用dir()BIF):
    johnny = NameList("John Paul Jones")
    >>> type(johnny)
    <class '__main__.NameList'>
    >>> dir(johnny)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'name', 'pop', 'remove', 'reverse', 'sort']
    使用list类提供的一些功能来补充Johnny中储存的数据:
    >>> johnny.append("Bass Player")
    >>> johnny.extend(["Composer", "Arranger", "Musician"])
    >>> johnny
    ['Bass Player', 'Composer', 'Arranger', 'Musician']
    johnny.name
    'John Paul Jones'
    >>> vera.name
    'Vera vi'
    由于Johnny是一个列表,所以完全可以对它做列表处理:
    >>> for attr in johnny:
        print(johnny.name + " is a " + attr + ".")
    
        
    John Paul Jones is a Bass Player.
    John Paul Jones is a Composer.
    John Paul Jones is a Arranger.
    John Paul Jones is a Musician.
  • 相关阅读:
    python常用代码: logging 和 无视locale强制东8区
    近期文摘2
    偶尔用一次windows开发,有点明白为何人觉得macos对开发友好
    zz golang str json map互转
    golang一些有价值文章摘录
    从 'golang新手容易犯的三个错误' 中学到的知识点
    macos下使用postgresql
    python netsnmp与pysnmp
    快速实现python抓包嗅探
    macos下npm install 报错: fsevents .... permission denined
  • 原文地址:https://www.cnblogs.com/assiduity/p/5958239.html
Copyright © 2020-2023  润新知