类的定制

__str__

首先看个例子:

>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...
>>> print(Student(‘Michael‘))
<__main__.Student object at 0x109afb190>

这样打印出的不好看, 给它定制一下:

>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...     def __str__(self):
...         return ‘Student object (name: %s)‘ % self.name
...
>>> print(Student(‘Michael‘))
Student object (name: Michael)

如果不用print()打印,显示的还是不好看:

>>> s = Student(‘Michael‘)
>>> s
<__main__.Student object at 0x109afb310>

这是因为直接显示调用 的不是__str__,而是__repr__(), 再定义一个__repr__()就行了,写法跟__str__完全一样。还有个简单的写法:

class Student(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return ‘Student object (name=%s)‘ % self.name
    __repr__ = __str__

__iter__

用类来实现肥波纳妾, 并可以迭代:

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration();
        return self.a # 返回下一个值
__getattr__

如果调用一个不存在的属性或方法,就会报错; 想要实现当调用 一个不存在的方法或属性时,给它返回自定义的内容。那就是再写一个__getattr__()方法:

class Student(object):

    def __init__(self):
        self.name = ‘Michael‘

    def __getattr__(self, attr):
        if attr==‘score‘:
            return 99

>>> s = Student()
>>> s.name
‘Michael‘
>>> s.score
99

如果我们调用其它的不存在的属性时,则会返回None,因为我们定义的__getattr__() 返回的就是None, 所以我们可以让__getattr__()响应特定属性的请求,其它的抛出AttributeError错误

class Student(object):

    def __getattr__(self, attr):
        if attr==‘age‘:
            return lambda: 25
        raise AttributeError(‘\‘Student\‘ object has no attribute \‘%s\‘‘ % attr)
 

__call()__

当我们执行一个实例时,自动调用的方法:

class Student(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print(‘My name is %s.‘ % self.name)

>>> s = Student(‘Michael‘)
>>> s() # self参数不要传入
My name is Michael.

这样的调用方式和函数是一样的,那我们要怎么区分一个变量是函数还是实例呢?

>>> callable(Student())
True
>>> callable(max)
True
>>> callable([1, 2, 3])
False
>>> callable(None)
False
>>> callable(‘str‘)
False
时间: 2024-11-09 16:21:08

类的定制的相关文章

python 元类与定制元类

1:元类 元类:类的创建与管理者 所有类的元类是type class a: pass print(type(a)) 结果:<class 'type'> 2:定制元类 类的实例化过程:(可看类的基础与要点) 1)调用__new__()创建实例 2)调用__init__()初始化上面创建出来的实例 所以:定制实例便是改变父类的__new__()或__init__()方法 例子: 1 class MyMeta(type): 2 def __init__(self,name,bases,dicts):

定制Writable类

以IntWritable为例介绍,定制writable的步骤 //WritableComparable接口继承了writable接口和comparable接口 public class IntWritable implements WritableComparable<IntWritable> { //定义普通java类型的成员变量 private int value; //成员变量的set方法 public void set(int value) { this.value = value;

UIKit框架各个类的简介

1.UIAcceleration: 被叫做加速事件的一个UIAcceleration类的实例是用来代表即时的三维加速数据.为了接收重力加速度,要注册一个应用应用程序作为一个共享UIAccelerater对象的委托对象(参考UIAcceleromete类). 2. UIAccelerater: UIAccelerater类可以让你的寄存器接收到从板载硬件上得到的加速相关数据.当设备移动时,它的硬件能够报告沿主线在三维空间中的线性加速度变化.你可以利用这些数据来检测器件的电流方向和该方向的瞬时变化.

面向对象【day08】:类的特殊成员-类的起源与metaclass

本节内容 类的特殊成员方法 类的起源于metaclass 一.类的特殊成员方法 一.概述 前面我们讲了类的方法,有普通方法,就是我们自己定义的方法,还有静态方法,类方法,属性方法,其实类还有另外一种方法,叫做类的特殊成员方法 1 __doc__ 说明:表示类的描述信息 1 2 3 4 5 6 7 8 9 10 11 class Dog(object):     """此类是形容Dog这个类"""    #类的描述信息     def __init

【python】-- 类的创建、__new__、__metaclass___

类的创建 前面的随笔都是关于类的知识,通过类创建对象,那这个类到底是怎么产生的呢? 1. 传统创建类 class Foo(object): def __init__(self,name): self.name = name f = Foo("shuaigaogao") f 是通过 Foo 类实例化的对象,其实,不仅 f 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象,按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该

Python中的类(下)

本文将介绍一下类的构造函数和初始化函数,以及如何通过"魔术方法"定制一个类. 类构造和初始化 在前面的文章中,经常使用初始化函数"__init__",下面看看"__init__"和"__new__"的联系和差别. 下面先通过一段代码看看这两个方法的调用顺序: class A(object): def __init__(self,*args, **kwargs): print "init %s" %self.

4.2 codecs--Codec注册管理和基类

本模块定义了Python标准codecs(编码和解码)的基类,也提供了对Python内部codec的注册,管理和数据处理过程.大部分标准的codecs都是文本编解码器,主要是用来把文本怎么样编码成字节方式.不过也有一些codecs是用来从文本到文本的编码方式,或者从字节到字节的编码方式.当然也可以根据基类来定制codecs,可以任意间的数据类型进行转换,只要注意在某些codecs是限制在文本编解码,某些是限制在字节之间编解码的. 对于任何的编解码器codec都有下面的函数: codecs.enc

类练习题1:将浮点数转化为金额的类

注:该练习题来自(Python 核心编程 第二版)第13章 练习题13-3,题目如下: 13-3.对类进行定制,写一个类,用来将浮点型值转化为金额,在本练习里,我们使用美国货币,但读者也可以自选任意货币. 基本任务:编写一个dollarize()函数,它以一个浮点型值作为输入,返回一个字符串形式的金额数.比如说: dollarize(1234567.8901) ﹦﹥ '$1,234,567.89' dollarize()返回的金额数里应该允许有逗号(比如1,000,000)和美元的货币符号.如果

Spring服务定制

问题总述 ? 我们都知道如果使用Spring来进行bean管理的时候.如果同一个接口的实现类存在两个,直接使用@Autowired注解来实现bean注入,会在启动的时候报异常.我们通常的做法是使用@Resource注解来执行bean的名称.不过通过@Resource注解类似于硬编码的方式,如果我们想修改接口的具体实现,必须修改代码.假设我们环境中针对所有接口,都有两套实现,一套在测试环境中使用,一个在生产环境中使用.那么当切换环境的时候,所有接口使用@Resource注入的地方都需要修改bean