8 python 定制自己的类,实现查看属性,按index取值,迭代,切片等个性化类

news/2024/7/4 1:20:12 标签: python, 迭代, class, 对象
class="baidu_pl">
class="article_content clearfix">
class="markdown_views prism-atom-one-dark">

1 str

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Studentclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__init__class="hljs-params">(self,name):
        self.name = name
class="hljs-keyword">print Student(class="hljs-string">'Michael')
<__main__.Student object at 0x7fa939eda310>

怎么打印的好看呢?

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Studentclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__init__class="hljs-params">(self,name):
        self.name = name
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__str__class="hljs-params">(self):
        class="hljs-keyword">return class="hljs-string">'Student object (name:%s)'  % self.name
class="hljs-keyword">print Student(class="hljs-string">'huxiang')
Student object (name:huxiang)

上面说明print 调用的是str这个方法,对不对?
但是不用print 输出还是很难看,例如:

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">Student(class="hljs-string">'huxiang')
<__main__.Student at 0x7fa939eda250>

这是为什么呢?直接输出调用的是另一个方法了,改写如下

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Studentclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__init__class="hljs-params">(self,name):
        self.name = name
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__str__class="hljs-params">(self):
        class="hljs-keyword">return class="hljs-string">'Student object (name=%s)' % self.name
    __repr__ = __str__
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">Student(class="hljs-string">'HUXIANG')
Student object (name=HUXIANG)

说明直接输出也是调用一个方法,而这个方法是repr

class="tags" href="/tags/DieDai.html" title=迭代>迭代">2 iter 实现class="tags" href="/tags/DieDai.html" title=迭代>迭代

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Fibclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__init__class="hljs-params">(self):
        self.a,self.b = class="hljs-number">0,class="hljs-number">1 class="hljs-comment">#初始值
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__iter__class="hljs-params">(self):
        class="hljs-keyword">return self
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-keyword">for n class="hljs-keyword">in Fib():
    class="hljs-keyword">print n
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<iclass="tags" href="/tags/PYTHON.html" title=python>python-input-8-b601c92d0330> in <module>()
----> 1 for n in Fib():
      2     print n


TypeError: iter() returned non-iterator of type 'Fib'
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Fibclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__init__class="hljs-params">(self):
        self.a,self.b = class="hljs-number">0,class="hljs-number">1 class="hljs-comment">#初始值
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__iter__class="hljs-params">(self):
        class="hljs-keyword">return self
    class="hljs-function">class="hljs-keyword">def class="hljs-title">nextclass="hljs-params">(self):class="hljs-comment">#next是什么?也是class="tags" href="/tags/DieDai.html" title=迭代>迭代时要用到的吗?
        self.a,self.b = self.b,self.a+self.b class="hljs-comment">#下一轮class="tags" href="/tags/DieDai.html" title=迭代>迭代后的值
        class="hljs-keyword">if self.a>class="hljs-number">100000:
            class="hljs-keyword">raise StopIteration();
        class="hljs-keyword">return self.a
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-keyword">for n class="hljs-keyword">in Fib():
    class="hljs-keyword">print n
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025

3 getitem用于取得第几个元素,所以改写这个方法就可以直接取某个元素了

例如这里没定义,直接去会报错

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">Fib()[class="hljs-number">5]
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<iclass="tags" href="/tags/PYTHON.html" title=python>python-input-11-f91ed6abd284> in <module>()
----> 1 Fib()[5]


TypeError: 'Fib' object does not support indexing
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Fibclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__getitem__class="hljs-params">(self,n):
        a,b = class="hljs-number">1, class="hljs-number">1
        class="hljs-keyword">for x class="hljs-keyword">in range(n):
            a, b = b, a + b
        class="hljs-keyword">return a
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">f = Fib()
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">f[class="hljs-number">5]
8

但是还不能切片,怎么实现切片呢?还是修改getitem这个方法,判断传入值的类型,然后再决定返回的类型

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Fibclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__getitem__class="hljs-params">(self,n):
        class="hljs-keyword">if isinstance(n,int):
            a, b = class="hljs-number">1, class="hljs-number">1
            class="hljs-keyword">for x class="hljs-keyword">in range(n):
                a, b = b, a + b
            class="hljs-keyword">return a
        class="hljs-keyword">if isinstance(n,slice):
            start = n.start
            stop = n.stop
            a, b = class="hljs-number">1, class="hljs-number">1
            L = []
            class="hljs-keyword">for x class="hljs-keyword">in range(stop):
                class="hljs-keyword">if x >= start:
                    L.append(a)
                a, b = b, a + b
            class="hljs-keyword">return L
  File "<iclass="tags" href="/tags/PYTHON.html" title=python>python-input-15-e90f9954e169>", line 6
    a, b = b, a + b
               ^
SyntaxError: invalid syntax

我靠我错在哪?

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Fibclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__getitem__class="hljs-params">(self, n):
        class="hljs-keyword">if isinstance(n, int):
            a, b = class="hljs-number">1, class="hljs-number">1
            class="hljs-keyword">for x class="hljs-keyword">in range(n):
                a, b = b, a + b
            class="hljs-keyword">return a
        class="hljs-keyword">if isinstance(n, slice):
            start = n.start
            stop = n.stop
            a, b = class="hljs-number">1, class="hljs-number">1
            L = []
            class="hljs-keyword">for x class="hljs-keyword">in range(stop):
                class="hljs-keyword">if x >= start:
                    L.append(a)
                a, b = b, a + b
            class="hljs-keyword">return L

下面就可以用切片了,爽!

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">f = Fib()
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">f[class="hljs-number">0:class="hljs-number">5]
[1, 1, 2, 3, 5]

总之,通过上面的方法,我们自己定义的类表现得和Python自带的list、tuple、dict没什么区别,这完全归功于动态语言的“鸭子类型”,不需要强制继承某个接口。

另外还有其他的 一些’内在方法’,例如:
Python解释器会试图调用getattr(self, ‘score’)来尝试获得属性,这样,我们就有机会返回score的值:

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Studentclass="hljs-params">(object):

    class="hljs-function">class="hljs-keyword">def class="hljs-title">__init__class="hljs-params">(self):
        self.name = class="hljs-string">'Michael'

    class="hljs-function">class="hljs-keyword">def class="hljs-title">__getattr__class="hljs-params">(self, attr):
        class="hljs-keyword">if attr==class="hljs-string">'score':
            class="hljs-keyword">return class="hljs-number">99
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">s = Student()
class="hljs-keyword">print s.name
class="hljs-keyword">print s.score
Michael
99

只需要定义一个call()方法,就可以直接对实例进行调用。请看示例:

class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">class="hljs-class">class="hljs-keyword">class class="hljs-title">Studentclass="hljs-params">(object):
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__init__class="hljs-params">(self):
        self.name = class="hljs-string">'huxiang'
    class="hljs-function">class="hljs-keyword">def class="hljs-title">__call__class="hljs-params">(self):
        print(class="hljs-string">'My name is %s.' % self.name)
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">s = Student()
s()
My name is huxiang.

小结

Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类。


http://www.niftyadmin.cn/n/1844057.html

相关文章

mac下安装vue.js

下载node node下载地址&#xff1a;链接 node -v 检查安装是否成功安装淘宝镜像 &#xff08;npm&#xff09; npm install -g cnpm --registryhttps://registry.npm.taobao.org安装webpack cnpm install webpack -g安装vue脚手架、自动安装vue框架工具 npm install vue-cl…

《软件工程(第4版?修订版)》—第1章1.1节什么是软件工程

本节书摘来自异步社区《软件工程&#xff08;第4版?修订版&#xff09;》一书中的第1章1.1节什么是软件工程&#xff0c;作者【美】Shari Lawrence Pfleeger , 【加】Joanne M.Atlee&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.1 什么是软件工程软件…

《21天学通C语言(第7版)》一第6课 基本程序控制6.1 数组:基本概念

本节书摘来自异步社区《21天学通C语言&#xff08;第7版&#xff09;》一书中的第6章&#xff0c;第6.1节&#xff0c;作者 【美】Bradley Jones , Peter Aitken , Dean Miller&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 第6课 基本程序控制 21天学通C语…

英国开放银行标准的诞生和前景

编者按 开放数据并非局限于政府数据的范畴&#xff0c;其概念和精神已被不同行业所拥抱&#xff0c;从而推动行业的变革和新形态的发展。在欧盟新规的推动下&#xff0c;英国的银行业正在完成一次拥抱“开放”的转变&#xff1a;为银行数据开发开放API使得第三方得以访问。本期…

9 python txt文件读写操作

txt读写操作&#xff0c;实现了在每一行文件加入了一些新的数据并保存在write.txt中&#xff0c;详情见代码。 # -*- coding: utf-8 -*- if __name__ "__main__":print "please input the file_name, end with .txt!"txt_name raw_input()if(txt_name.s…

Vue自学笔记

Vue学习笔记MVVM模式和第一个Vue程序MVVM模式第一个Vue程序基础语法v-bindv-if,v-elsev-forVue绑定事件Vue表单双向绑定、组件什么是双向数据绑定实现表单双向绑定定义一个组件使用 props 属性动态传递参数Axios异步通信Axios概述第一个 Axios 应用程序计算属性methods方法与co…

10 python yield用法详解

&#xff11; yield表达式(generator) 其实感觉就是为了让它能用for i in (这个东西)中&#xff0c;构造了一个生成器&#xff0c;需要一个就生成给你&#xff0c;例如&#xff1a; 这里每次生成列表中的一个数字&#xff0c;可以直接用for l [2,3,4] def foo(list2gen):fo…

《Web前端开发精品课 HTML与CSS进阶教程》——2.4 表格语义化

本节书摘来自异步社区《Web前端开发精品课 HTML与CSS进阶教程》一书中的第2章&#xff0c;第2.4节&#xff0c;作者&#xff1a; 莫振杰 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.4 表格语义化 不少初学者看了《Web前端开发精品课HTML和CSS基础教程》&#xf…