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

▲定制类

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

时间: 2024-07-30 13:43:03

Python笔记7#面向对象高级编程二的相关文章

C++面向对象高级编程(二)

版权声明:本文为博主原创文章,未经博主允许不得转载. 接下来的几篇文章,我将回忆一下C++的基础. C++的由两部分组成 1.C++语言 2.C++标准库 本篇文章主要分享我学习C++语言的笔记. 这次主要回忆一下操作符重载. 先看一段代码,后续我会介绍这么做的原由 #include <iostream> class complex { public: complex(double r = 0, double i = 0) : re(r) ,im(i) {} complex& oper

Python学习笔记八 面向对象高级编程(二)元类

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 在廖老师的学习网站里"使用元类"这部分还是把我给看晕了...网上搜到一篇感觉讲的相对易懂一些,贴出链接:两句话掌握 Python 最难知识点--元类--以此文作为这篇笔记的源本. "道生一,一生二,二生三,三生万物" 1.在Python世界中,"type"即为道

python学习笔记(七) - 面向对象高级编程

一. 为类动态添加属性和方法: 1. 动态给一个实例添加属性和方法: 给一个实例绑定的方法,对另一个实例是不起作用的. class Student(object): pass s = Student() s.name = 'Michael' # 动态给实例绑定一个属性 print s.name def set_age(self, age): # 定义一个函数作为实例方法 self.age = age from types import MethodType s.set_age = MethodT

Python学习笔记八 面向对象高级编程(一)

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 一.使用__slots__ 正常情况下,当定义了一个类之后,我们可以给这个类的实例绑定任何属性,这就是动态语言的优势: class Student(object): def __init__(self,name,age): self.name=name self.age=age bob=Student('Bob

Python学习笔记捌——面向对象高级编程

__slots__特殊变量的使用: 由于Python是动态语言,允许先编写类,然后在创建实例的时候添加属性或者方法:而__slots__特殊变量就是,限制往类里添加属性的: 在创建类的时候,使用__slots__ =('name','age'),就是在创建实例时候,只允许添加绑定name和age两个属性:注意!__slots__只对当前类有效,不会作用于子类: @property装饰器:为了实现数据的封装,不把属性暴露在外面,所以如果想访问实例内部属性的话,就需要使用get和set方法,但是这样

python基础之面向对象高级编程

面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有

Python笔记6#面向对象高级编程一

▲__slots__ 当定义一个class并创建了一个class的实例之后,我们可以给该实例绑定任何属性和方法.这就是动态语言的灵活性. 实例代码如下: #定义一个类Student >>> class Student(object): ... pass ... #创建类Student的一个实例stu1 >>> stu1 = Student() #给实例绑定一个属性name >>> stu1.name = 'michael' >>> s

python Class:面向对象高级编程 多重继承

继承:通过子类继承父类信息而达到子类可以扩展功能的目的 多重继承:通过子类继承多个类 一.多重继承一类 套用廖雪峰的例子: https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200511568dd94e77b21d4b8597ede8bf65c36bcd000 Dog - 狗狗: Bat - 蝙蝠: Parrot - 鹦鹉: Ostrich - 鸵鸟. 按哺乳和鸟类

python Class:面向对象高级编程 Enum(枚举)、@unique

注:python 3.x版本才能使用 枚举格式: from enum import Enum 新类名 = Enum(变量统称名,(变量1,变量2....)) Month = Enum('month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) 1. seasons = ['Spring', 'Summer', 'Fall', 'Winter'] print (list