17 python内置特殊方法

 1 __str__和__repr__
 2 如果要把一个类的实例变成 str,就需要实现特殊方法__str__():
 3 
 4 class Person(object):
 5     def __init__(self, name, gender):
 6         self.name = name
 7         self.gender = gender
 8     def __str__(self):
 9         return '(Person: %s, %s)' % (self.name, self.gender)
10 现在,在交互式命令行下用 print 试试:
11 
12 >>> p = Person('Bob', 'male')
13 >>> print p
14 (Person: Bob, male)
15 但是,如果直接敲变量 p:
16 
17 >>> p
18 <main.Person object at 0x10c941890>
19 似乎__str__() 不会被调用。
20 
21 因为 Python 定义了__str__()和__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员。
22 
23 有一个偷懒的定义__repr__的方法:
24 
25 class Person(object):
26     def __init__(self, name, gender):
27         self.name = name
28         self.gender = gender
29     def __str__(self):
30         return '(Person: %s, %s)' % (self.name, self.gender)
31     __repr__ = __str__
32 任务
33 请给Student 类定义__str__和__repr__方法,使得能打印出<Student: name, gender, score>34 
35 class Student(Person):
36     def __init__(self, name, gender, score):
37         super(Student, self).__init__(name, gender)
38         self.score = score
39 ?不会了怎么办
40 只要为Students 类加上__str__()和__repr__()方法即可。
41 
42 参考代码:
43 
44 class Person(object):
45     def __init__(self, name, gender):
46         self.name = name
47         self.gender = gender
48 
49 class Student(Person):
50     def __init__(self, name, gender, score):
51         super(Student, self).__init__(name, gender)
52         self.score = score
53     def __str__(self):
54         return '(Student: %s, %s, %s)' % (self.name, self.gender, self.score)
55     __repr__ = __str__
56 
57 s = Student('Bob', 'male', 88)
58 print s    ## 会调用__str__()函数
59 
60 
61 
62 ########################  __call__()  ################################################
63 一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法。
64 
65 Python中,如果在创建class的时候写了call()方法, 那么该class实例化出实例后, 实例名()就是调用call()方法。
66 
67 
68 class Person(object):
69     def __init__(self, name, gender):
70         self.name = name
71         self.gender = gender
72 
73     def __call__(self, friend):
74         print 'My name is %s...' % self.name
75         print 'My friend is %s...' % friend
76 
77 
78 p=Person('huang',88)   ## 此步执行时,即类实例化了,构造函数会自动执行
79 p('xiaren')   ## 只有此步,才会自动调用__call__内置方法

 

posted @ 2018-07-02 15:51  虫儿要吃草  阅读(255)  评论(0编辑  收藏  举报