码迷,mamicode.com
首页 > 编程语言 > 详细

Python笔记7#面向对象高级编程二

时间:2015-01-30 14:49:24      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

▲定制类

Python中有许多类似__slots__这样有特殊用途的函数,可以帮助我们定制类。

官方文档链接:https://docs.python.org/3.4/reference/datamodel.html#special-method-names

1)__str__和__repr__

示例代码如下:

>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...
>>> stu1 = Student(jack)
>>> stu1
<__main__.Student object at 0x01740E70>
>>> print(stu1)
<__main__.Student object at 0x01740E70>

>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
#print(stu1)调用__str__方法,返回用户看到的字符串
...     def __str__(self):
...         return Student object (name: %s) % self.name
...
>>> stu1 = Student(rose)
>>> stu1
<__main__.Student object at 0x0174A030>
>>> print(stu1)
Student object (name: rose)

>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...     def __str__(self):
...         return Student object (name: %s) % self.name
#stu1调用__repr__方法,返回开发者看到的字符串
...     __repr__ = __str__
...
>>> stu1 = Student(michael)
>>> stu1
Student object (name: michael)
>>> print(stu1)
Student object (name: michael)

2)__iter__和__getitem__()

如果一个class想要类似list或tuple一样可用于for..in..循环,需要实现__iter__()方法。该方法返回一个迭代对象(必须是自身self),然后for循环不断调用class实例的循环方法__next__()拿到下一个值,直至退出循环。

如果需要实例像list那样按照下标取出元素,需要实现__getitem__()方法。

示例代码如下:

#coding:utf-8

#创建一个fib数列迭代器
class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1
#实例本身就是迭代器,返回自身
    def __iter__(self):
        return self
#python3中next()方法改为__next__()
    def __next__(self):
        self.a, self.b = self.b, self.a + self.b
        if self.a > 500:
            raise StopIteration();
        return self.a
#__getitem__()可接收整数integer和切片slice
    def __getitem__(self, n):
        if isinstance(n, int):
            a, b = 1, 1
            for x in range(n):
                a, b = b, a + b
            return a
        if isinstance(n, slice):
            start = n.start
            stop = n.stop
            a, b = 1, 1
            L = []
            for x in range(stop):
                if x >= start:
                    L.append(a)
                a, b = b, a + b
            return L

for i in Fib():
    print(i)
print(- * 50)
print(Fib()[5])
print(- * 50)
print(Fib()[5:10])

运行结果:

1
1
2
3
5
8
13
21
34
55
89
144
233
377
--------------------------------------------------
8
--------------------------------------------------
[8, 13, 21, 34, 55]

3)__getattr__

当调用的类的属性或方法不存在时,会报错。但是我们使用__getattr__()方法写一个动态返回一个属性或方法。

只有在没有找到属性或方法时,才会在__getattr__中寻找。__getattr__()默认返回None。

4)__call__

一个对象可以由自己的属性和方法,我们调用方法一般通过instance.method()来调用。如果想要实现在实例本身上调用,需要定义__call__()方法。

通过callable()可以判断一个对象本身是否是可调用的。

▲元类metaclass

Python笔记7#面向对象高级编程二

标签:

原文地址:http://www.cnblogs.com/wddoer/p/4261734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!