返回介绍

01. Python 工具

02. Python 基础

03. Numpy

04. Scipy

05. Python 进阶

06. Matplotlib

07. 使用其他语言进行扩展

08. 面向对象编程

09. Theano 基础

10. 有趣的第三方模块

11. 有用的工具

12. Pandas

特殊方法

发布于 2022-09-03 20:46:14 字数 7799 浏览 0 评论 0 收藏 0

Python 使用 __ 开头的名字来定义特殊的方法和属性,它们有:

  • __init__()
  • __repr__()
  • __str__()
  • __call__()
  • __iter__()
  • __add__()
  • __sub__()
  • __mul__()
  • __rmul__()
  • __class__
  • __name__

构造方法 __init__()

之前说到,在产生对象之后,我们可以向对象中添加属性。事实上,还可以通过构造方法,在构造对象的时候直接添加属性:

In [1]:

class Leaf(object):
    """
 A leaf falling in the woods.
 """
    def __init__(self, color='green'):
        self.color = color

默认属性值:

In [2]:

leaf1 = Leaf()

print leaf1.color
green

传入有参数的值:

In [3]:

leaf2 = Leaf('orange')

print leaf2.color
orange

回到森林的例子:

In [4]:

import numpy as np

class Forest(object):
    """ Forest can grow trees which eventually die."""
    def __init__(self):
        self.trees = np.zeros((150,150), dtype=bool)
        self.fires = np.zeros((150,150), dtype=bool)

我们在构造方法中定义了两个属性 treesfires

In [5]:

forest = Forest()

forest.trees

Out[5]:

array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ..., 
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]], dtype=bool)

In [6]:

forest.fires

Out[6]:

array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ..., 
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]], dtype=bool)

修改属性的值:

In [7]:

forest.trees[0,0]=True
forest.trees

Out[7]:

array([[ True, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ..., 
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]], dtype=bool)

改变它的属性值不会影响其他对象的属性值:

In [8]:

forest2 = Forest()

forest2.trees

Out[8]:

array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ..., 
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]], dtype=bool)

事实上,__new__() 才是真正产生新对象的方法,__init__() 只是对对象进行了初始化,所以:

leaf = Leaf()

相当于

my_new_leaf = Leaf.__new__(Leaf)
Leaf.__init__(my_new_leaf)
leaf = my_new_leaf

表示方法 __repr__()__str__()

In [9]:

class Leaf(object):
    """
 A leaf falling in the woods.
 """
    def __init__(self, color='green'):
        self.color = color
    def __str__(self):
        "This is the string that is printed."
        return "A {} leaf".format(self.color)
    def __repr__(self):
        "This string recreates the object."
        return "{}(color='{}')".format(self.__class__.__name__, self.color)

__str__() 是使用 print 函数显示的结果:

In [10]:

leaf = Leaf()

print leaf
A green leaf

__repr__() 返回的是不使用 print 方法的结果:

In [11]:

leaf

Out[11]:

Leaf(color='green')

回到森林的例子:

In [12]:

import numpy as np

class Forest(object):
    """ Forest can grow trees which eventually die."""
    def __init__(self, size=(150,150)):
        self.size = size
        self.trees = np.zeros(self.size, dtype=bool)
        self.fires = np.zeros((self.size), dtype=bool)

    def __repr__(self):
        my_repr = "{}(size={})".format(self.__class__.__name__, self.size)
        return my_repr

    def __str__(self):
        return self.__class__.__name__

In [13]:

forest = Forest()

__str__() 方法:

In [14]:

print forest
Forest

__repr__() 方法:

In [15]:

forest

Out[15]:

Forest(size=(150, 150))

__name____class__ 为特殊的属性:

In [16]:

forest.__class__

Out[16]:

__main__.Forest

In [17]:

forest.__class__.__name__

Out[17]:

'Forest'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文