Python 温习

关于Python内置函数的示例

 1 Type "copyright", "credits" or "license()" f重写or more information.
 2 >>> class Student:
 3     def __init__(self,score):
 4         self.score=score
 5     def __len__(self):
 6         return self.score
 7 
 8     
 9 >>> Jack=Student()
10 >>> Jack=Student(103)
11 >>> Jack
12 <__main__.Student object at 0x02BDA470>
13 >>> len(Jack)
14 103
 1 >>> class qwe(str):
 2     def upper(self):
 3         return self.lower()
 4 
 5     
 6 >>> a='ASD'
 7 >>> a=qwe(a)
 8 >>> a
 9 'ASD'
10 >>> a.upper()
11 'asd'

测试对象属性的部分方法.

 1 Type "copyright", "credits" or "license()" for more information.
 2 >>> class Student():
 3     pass
 4 
 5 >>> Jack=Student()
 6 >>> hasattr(Jack,'name')
 7 False
 8 >>> Jack.name='Jack'
 9 >>> Jack.name
10 'Jack'
11 >>> hasattr(Jack,'score')
12 False
13 >>> setattr(Jack,'socre',103)
14 >>> Jack.socre
15 103
 1 Type "copyright", "credits" or "license()" for more information.
 2 >>> class Student():
 3     name='jack'
 4 
 5     
 6 >>> jack=Student()
 7 >>> jack.name
 8 'jack'
 9 >>> getattr(jack,name)
10 Traceback (most recent call last):
11   File "<pyshell#5>", line 1, in <module>
12     getattr(jack,name)
13 NameError: name 'name' is not defined
14 >>> getattr(jack,'name')
15 'jack'
16 >>> getattr(jack,'score',404)
17 404

关于类的实例属性和类属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性 . (s.name='jack')

给实例绑定属性的方法是通过实例变量直接赋值,或者通过self变量 . 

下面就是通过self变量来绑定类属性.

如果类本身就有该属性的话 , 当声明实例变量之后 , 会自动绑定类中提供的属性 , 但是如果在通过实例变量直接再将该属性再次赋值 , 这次的值可以覆盖类中的属性 , 当删除通过实例变量赋值过的属性之后 , 类中的属性就会自动重新绑定到实例变量上面.

 1 >>> class Student():
 2     name='Student'
 3 
 4     
 5 >>> s=Student()
 6 >>> s.name
 7 'Student'
 8 >>> s.name='jack'
 9 >>> s.name
10 'jack'
11 >>> del s.name
12 >>> s
13 <__main__.Student object at 0x02EE34B0>
14 >>> s.name
15 'Student'
16 >>> 

 

当类已经写好之后如何分别在 实例变量和类中 再次加入方法 , 方法的作用范围是什么?

2016年7月26日 02:33:28 ......不早了 去冲个澡再来 .  

 1 Type "copyright", "credits" or "license()" for more information.
 2 >>> class Student:
 3     pass
 4 
 5 >>> jack=Student()
 6 >>> # 先开始给实例变量绑定属性 (只作用于该变量)
 7 >>> def Set_age(self,age):  #  和普通的类一样 这里也必须是 self 
 8     self.age=age
 9 
10     
11 >>> Set_age(jack,18)
12 >>> jack.age
13 18
14 >>> loser=Student()
15 >>> loser.age
16 Traceback (most recent call last):
17   File "<pyshell#11>", line 1, in <module>
18     loser.age
19 AttributeError: 'Student' object has no attribute 'age'

上面的是比较简单的 . 直接写一个函数 , 套进去就行 . 

下面开始将 类 绑定方法 并且观察作用范围 . 

 1 >>> from types import MethodType
 2 >>> class Student():
 3     pass
 4 
 5 >>> def Set_age(self,age):
 6     self.age=age
 7 
 8     
 9 >>> jack=Student()
10 >>> Student.Set_age=MethodType(Set_age,Student)
11 >>> loser=Student()
12 >>> jack.Set_age(18)
13 >>> loser.Set_age(28)
14 >>> jack.age
15 28
16 >>> 
17 >>> loser.age
18 28

可以看出来 , 不管添加方法是在该实例变量声明之前 还是 声明之后 这个实例变量都可以使用添加进去的方法 . 但是在添加之前 是不能让 已经声明的实例变量使用 将要添加的方法的.

如何限制实例的属性 .

 1 >>> class Student():
 2     __slots__=('name')
 3 
 4     
 5 >>> jack=Student()
 6 >>> jack.name='Jack'
 7 >>> jack.score=19
 8 Traceback (most recent call last):
 9   File "<pyshell#5>", line 1, in <module>
10     jack.score=19
11 AttributeError: 'Student' object has no attribute 'score'
 1 >>> class Student():
 2     __slots__=('name')
 3 
 4     
 5 >>> class Teacher(Student):
 6     pass
 7 
 8 >>> jack=Teacher()
 9 >>> jack.score=18
10 >>> jack.score
11 18

当继承的时候 __slots__是不起作用的 ,  

当我们用  Python  的  print  输出的时候他们是调用该实例对象对应的类中 __str__函数 , 当直接调用该实例对象的时候 运行的是 __repr__

 1 >>> class Student():
 2     def __init__(self,name):
 3         self.name=name
 4     def __str__(self):
 5         return ('Student named %s' %self.name)
 6 
 7     
 8 >>> jack=Student('Jack')
 9 >>> print(jack)
10 Student named Jack
11 >>> jack
12 <__main__.Student object at 0x02E41ED0>
13 >>> class Student():
14     def __init__(self,name):
15         self.name=name
16     def __str__(self):
17         return ('Student named %s' %self.name)
18     __repr__=__str__
19 
20     
21 >>> jack=Student('Jack')
22 >>> jack
23 Student named Jack

__iter__ 迭代

如果一个类被用于 for 循环 , 类似list 和 tuple那样 , 就必须实现一个 __iter__方法 , 该方法返回一个迭代对象 , 然后 , Python 的 for 循环就会 开始调用 __next__方法 拿到循环的下一个值 . 直到遇到 StopIteration错误时推出循环 .

下面我们写一个 Fib 类 , 可以用作for循环 ,                                              

 1 >>> class Fib():
 2     def __init__(self):
 3         self.a,self.b=0,1 # 初始化两个计数器 a,b
 4     def __iter__(self):
 5         return self # 实例的本身就是迭代对象 , 故只返回自己
 6     def __next__(self):
 7         self.a,self.b=self.b,self.a+self.b # 计算下一个值   # 在这里 没有先后之分 . 
 8         return self.a # 返回下一个值
 9 
10     
11 >>> for i in Fib():
12     print(i)
13 1
14 1
15 2
16 3
17 5
18 8
19 13
20 21
21 34
22 55
23 89
24 144
25 233
26 377
27 610
28 987
29 1597
30 2584
31 4181
32 6765

 

                                                                                                                                                                                                                                                                                                                                                                                           

 

posted @ 2016-07-26 03:26  X-POWER  阅读(312)  评论(0编辑  收藏  举报