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 ">
self.name = name
Student( )
<__main__.Student object at 0x7fa939eda310>
怎么打印的好看呢?
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">
self.name = name
% self.name
Student( )
Student object (name:huxiang)
上面说明print 调用的是str这个方法,对不对?
但是不用print 输出还是很难看,例如:
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">Student( )
<__main__.Student at 0x7fa939eda250>
这是为什么呢?直接输出调用的是另一个方法了,改写如下
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">
self.name = name
% self.name
__repr__ = __str__
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">Student( )
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 ">
self.a,self.b = ,
self
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs "> n Fib():
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 ">
self.a,self.b = ,
self
self.a,self.b = self.b,self.a+self.b
self.a> :
StopIteration();
self.a
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs "> n Fib():
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()[ ]
---------------------------------------------------------------------------
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 ">
a,b = ,
x range(n):
a, b = b, a + b
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[ ]
8
但是还不能切片,怎么实现切片呢?还是修改getitem这个方法,判断传入值的类型,然后再决定返回的类型
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">
isinstance(n,int):
a, b = ,
x range(n):
a, b = b, a + b
a
isinstance(n,slice):
start = n.start
stop = n.stop
a, b = ,
L = []
x range(stop):
x >= start:
L.append(a)
a, b = b, a + b
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 ">
isinstance(n, int):
a, b = ,
x range(n):
a, b = b, a + b
a
isinstance(n, slice):
start = n.start
stop = n.stop
a, b = ,
L = []
x range(stop):
x >= start:
L.append(a)
a, b = b, a + b
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[ : ]
[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 ">
self.name =
attr== :
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">s = Student()
s.name
s.score
Michael
99
只需要定义一个call()方法,就可以直接对实例进行调用。请看示例:
class="prettyprint">class="language-class="tags" href="/tags/PYTHON.html" title=python>python hljs ">
self.name =
print( % 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允许定义许多定制方法,可以让我们非常方便地生成特定的类。