第11章-课程

python中的一切都是一个对象。这是一个非常模糊的陈述,除非你上过一两门计算机编程课。这意味着 事情 在python中有方法和值。原因是一切都是基于一个类。类是对象的蓝图。让我们看看我的意思:

>>> x = "Mike"
>>> dir(x)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
'__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__',
'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count',
'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum',
'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust',
'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']

这里我们为变量分配了一个字符串 x .它看起来可能不太像,但是这个字符串有很多方法。如果使用python的 dir 关键字,可以获取可以对字符串调用的所有方法的列表。这里有71种方法!从技术上讲,我们不应该直接调用以下划线开头的方法,这样可以将总数减少到38,但这仍然是很多方法!但这意味着什么?它意味着字符串是基于类和 x 是一个 实例 是那个班的!

在Python中,我们可以创建自己的类。我们开始吧!

创建类

在Python中创建类非常简单。下面是一个非常简单的例子:

# Python 2.x syntax
class Vehicle(object):
    """docstring"""

    def __init__(self):
        """Constructor"""
        pass

这门课没有做任何特别的事情,但是它是一个很好的学习工具。例如,要创建一个类,我们需要使用python的 关键字,后跟类的名称。在python中,约定类名称应该大写第一个字母。接下来我们有一个左括号,后面跟一个单词 对象 还有一个右括号。这个 对象 类所基于或继承的内容。这称为基类或父类。python中的大多数类都基于 对象 .类有一个特殊的方法 __init__ (用于初始化)。每当您基于此类创建(或实例化)对象时,都会调用此方法。这个 __init__ 方法只被调用一次,不在程序内部再次调用。另一个术语 __init__构造函数 尽管这个术语在python中的使用并不多。

你可能想知道我为什么不停地说 方法 而不是 功能 .函数在类中时将其名称更改为“method”。您还将注意到,每个方法都必须至少有一个参数(即self),对于正则函数来说这不是真的。

在python 3中,我们不需要明确地说我们继承自 对象 .相反,我们可以这样写:

# Python 3.x syntax
class Vehicle:
    """docstring"""

    def __init__(self):
        """Constructor"""
        pass

你会注意到唯一的区别是,如果我们将类建立在 对象 .让我们稍微扩展一下类定义,并给它一些属性和方法。

class Vehicle(object):
    """docstring"""

    def __init__(self, color, doors, tires):
        """Constructor"""
        self.color = color
        self.doors = doors
        self.tires = tires

    def brake(self):
        """
        Stop the car
        """
        return "Braking"

    def drive(self):
        """
        Drive the car
        """
        return "I'm driving!"

上面的代码添加了三个属性和两个方法。这三个属性是:

self.color = color
self.doors = doors
self.tires = tires

属性描述车辆。所以车辆有一个颜色,一些门和一些轮胎。它还有两种方法。方法描述类的作用。因此,在这种情况下,车辆可以 刹车开车 .你可能已经注意到所有的方法,包括第一个方法都有一个有趣的论点,叫做 self .我们来谈谈!

什么是自我?

Python类需要一种引用它们自己的方法。这不是一种自恋的肚脐凝视着班上的一部分。相反,它是一种区分一个实例和另一个实例的方法。这个词 self 字面上是一种自我描述的方式。让我们来看一个例子,当我学习一些新的和奇怪的东西时,我总是发现这很有用:

将以下代码添加到上面编写的类的末尾并保存它:

if __name__ == "__main__":
    car = Vehicle("blue", 5, 4)
    print(car.color)

    truck = Vehicle("red", 3, 6)
    print(truck.color)

上面的条件语句是一种常见的方法,它告诉Python,如果将此代码作为独立文件执行,您只希望运行以下代码。如果您已经将模块导入到另一个脚本中,那么条件下的代码将不会运行。无论如何,如果运行此代码,您将创建两个Vehicle类实例:一个Car实例和一个Truck实例。每个实例都有自己的属性和方法。这就是为什么当我们打印出每个实例的颜色时,它们是不同的。原因是该类正在使用 self 告诉自己哪个是哪个的论点。让我们稍微改变一下类,使方法更加独特:

class Vehicle(object):
    """docstring"""

    def __init__(self, color, doors, tires, vtype):
        """Constructor"""
        self.color = color
        self.doors = doors
        self.tires = tires
        self.vtype = vtype

    def brake(self):
        """
        Stop the car
        """
        return "%s braking" % self.vtype

    def drive(self):
        """
        Drive the car
        """
        return "I'm driving a %s %s!" % (self.color, self.vtype)

if __name__ == "__main__":
    car = Vehicle("blue", 5, 4, "car")
    print(car.brake())
    print(car.drive())

    truck = Vehicle("red", 3, 6, "truck")
    print(truck.drive())
    print(truck.brake())

在这个例子中,我们传递另一个参数来告诉类我们创建的是哪种车型。然后我们为每个实例调用每个方法。如果运行此代码,则应看到以下输出:

car braking
I'm driving a blue car!
I'm driving a red truck!
truck braking

这演示了实例如何跟踪其“自身”。您还将注意到,我们能够从 __init__ 方法转换为其他方法。原因是,所有这些属性都是用 自我。 .如果不这样做,变量在 __init__ 方法。

子类

当你进入子类时,类的真正力量就变得明显了。您可能没有意识到,但是我们在创建基于的类时已经创建了一个子类。 对象 .换句话说,我们将 对象 .现在因为 对象 不是很有趣,前面的例子没有真正演示子类化的功能。所以让我们把我们的车辆分类,并找出所有这些是如何工作的。

class Car(Vehicle):
    """
    The Car class
    """

    def brake(self):
        """
        Override brake method
        """
        return "The car class is breaking slowly!"

if __name__ == "__main__":
    car = Car("yellow", 2, 4, "car")
    car.brake()
    'The car class is breaking slowly!'
    car.drive()
    "I'm driving a yellow car!"

对于这个例子,我们将 车辆 类。你会注意到我们没有包括 __init__ 方法或 开车 方法。原因是,当您对车辆进行子类化时,除非您重写它们,否则您将获得其所有属性和方法。因此,您会注意到我们确实覆盖了 刹车 方法并使其表示与默认值不同的内容。其他的方法也一样。所以当你告诉车开的时候,它使用了原始的方法,我们知道我们开的是一辆黄色的车。不是很整洁吗?

使用父类的默认值称为 继承遗传 .这是面向对象编程(OOP)中的一个大主题。这也是一个简单的例子 多态性 .多态类通常具有相同的接口(即方法、属性),但它们彼此不知道。在PythonLand中,多态性对于确保接口完全相同并不十分严格。相反,它遵循了 鸭子打字 .关于 鸭子打字 如果它像鸭子一样走路,像鸭子一样说话,那一定是鸭子。所以在Python中,只要类的方法名相同,方法的实现是否不同就不重要了。

无论如何,您真的不需要知道在Python中使用类的所有细节。你只需要知道这些术语,所以如果你想更深入地挖掘,你就能够做到。您可以找到许多关于python多态性的好例子,这些例子将帮助您确定是否以及如何在自己的应用程序中使用这个概念。

现在,当您子类时,您可以根据需要从父类重写尽可能多或很少的内容。如果您完全重写了它,那么您创建一个新类可能也会很好。

总结

课程有点复杂,但它们非常强大。它们允许您跨方法使用变量,从而使代码重用更加容易。我建议您查看一下Python的源代码,了解一些关于如何定义和使用类的优秀示例。

我们现在已经到了第一部分的结尾了。恭喜你能走这么远!现在您拥有了在Python中构建任何东西所必需的工具!在第二部分中,我们将花时间学习如何使用Python发行版中包含的一些出色模块。这将帮助您更好地理解Python的功能,并熟悉使用标准库。第二部分基本上是一组教程,帮助您成为一名优秀的Python程序员!