讨论区讨论详情

【暑期班】计算机科学和Python编程导论
2016-08-31 21:42:17
  1. #模块:  
  2.   
  3. #Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。  
  4. import sys  
  5. #sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称  
  6. hello.py  
  7. if __name__=='__main__':  
  8.     test()  
  9. #当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,  
  10. #if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。  
  11.   
  12.   
  13. #访问权限:  
  14. #__xxx__这样的变量是特殊变量,可以被直接引用(public),但是有特殊用途  
  15. #_xxx虽然我可以被访问,但是,请把我视为私有变量,不要随意访问(public)  
  16. #_xxx和__xxx这样的函数或变量就是非公开的(private)  
  17.   
  18.   
  19.   
  20. #类:可以多继承,其它特性类似java,如多态子类覆盖父类方法  
  21. class student(object): #继承object  
  22.   
  23.   
  24. #类型判断:type  
  25. >>> import types  
  26. >>> type('abc')==types.StringType  
  27.   
  28. isinstance:  
  29. >>> h = Husky()  
  30. >>> isinstance(h, Husky)  
  31. True  
  32. >>> isinstance('a', (str, unicode))  
  33. True  
  34.   
  35.   
  36. dir()  
  37. #如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list  
  38.   
  39. #类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,  
  40. #实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:  
  41. >>> len('ABC')  
  42. 3  
  43. >>> 'ABC'.__len__()  
  44. 3  
  45.   
  46.   
  47. #配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:  
  48. >>> getattr(obj, 'z'404# 获取属性'z',如果不存在,返回默认值404  
  49. 404  
  50. >>> hasattr(obj, 'x'# 有属性'x'吗?  
  51. True  
  52. >>> obj.x  
  53. 9  
  54. >>> hasattr(obj, 'y'# 有属性'y'吗?  
  55. False  
  56. >>> setattr(obj, 'y'19# 设置一个属性'y'  
  57. >>> hasattr(obj, 'y'# 有属性'y'吗?  
  58. True  
  59. >>> getattr(obj, 'y'# 获取属性'y'  
  60. 19  
  61.   
  62. #fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn  
  63. #调用fn()  
  64.   
  65.   
  66.   
  67. __slots__  
  68. #创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性  
  69. >>> class Student(object):  
  70. ...     pass  
  71. ...  
  72. >>> s = Student()  
  73. >>> s.name = 'Michael' # 动态给实例绑定一个属性  
  74. >>> print s.name  
  75. Michael  
  76.   
  77. >>> def set_age(self, age): # 定义一个函数作为实例方法  
  78. ...     self.age = age  
  79. ...  
  80. >>> from types import MethodType  
  81. >>> s.set_age = MethodType(set_age, s, Student) # 给实例绑定一个方法MethodType(方法名,实例,参数)  
  82. >>> s.set_age(25# 调用实例方法  
  83. >>> s.age # 测试结果  
  84. 25  
  85.   
  86. #也可以对类绑定,这样对所有实例起作用  
  87. >>> def set_score(self, score):  
  88. ...     self.score = score  
  89. ...  
  90. >>> Student.set_score = MethodType(set_score, None, Student)  
  91.   
  92.   
  93. #__slots__限制类的属性:(__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的)  
  94. >>> class Student(object):  
  95. ...     __slots__ = ('name''age'# 用tuple定义允许绑定的属性名称  
  96. ...  
  97.   
  98. #@property :通过getter和setter方法  
  99. class Student(object):  
  100.  
  101.     @property  
  102.     def birth(self):  
  103.         return self._birth  
  104.  
  105.     @birth.setter#只设置setter方法  
  106.     def birth(self, value):  
  107.         self._birth = value  
  108.   
  109.   
  110. #自定义类:  
  111.   
  112. #__str__:(相当于java重写toString()方法)  
  113. <__main__.Student object at 0x109afb190>  
  114. #打印出来的是字符串,实现__str__  
  115. >>> class Student(object):  
  116. ...     def __init__(self, name):  
  117. ...         self.name = name  
  118. ...     def __str__(self):  
  119. ...         return 'Student object (name: %s)' % self.name  
  120. ...  
  121. >>> print Student('Michael')  
  122. Student object (name: Michael)  
  123.   
  124. #__iter__:Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值(像list和tuple)  
  125.   
  126. class Student(object):  
  127.  def __init__(self):  
  128.         self.a, self.b = 01 # 初始化两个计数器a,b  
  129.   
  130.     def __iter__(self):  
  131.         return self # 实例本身就是迭代对象,故返回自己  
  132.   
  133.     def next(self):  
  134.         self.a, self.b = self.b, self.a + self.b # 计算下一个值  
  135.         if self.a > 100000# 退出循环的条件  
  136.             raise StopIteration();  
  137.         return self.a # 返回下一个值  
  138.   
  139. >>> for n in Fib():  
  140. ...     print n  
  141. ...  
  142. 1  
  143. 1  
  144. 2  
  145. 3  
  146. 5  
  147. ...  
  148. 46368  
  149. 75025  
  150.   
  151. #__getitem__:(可像list一样下标访问)  
  152.   
  153. class Sutdent(object):  
  154.     def __getitem__(self, n):  
  155.         a, b = 11  
  156.         for x in range(n):  
  157.             a, b = b, a + b  
  158.         return a  
  159.   
  160.   
  161. #Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数  
  162.   
  163.   
  164. #__getattr__:(动态返回一个属性、方法,实现后不存在就不报错了,如果存在则不会执行自己实现的)  
  165. class Student(object):  
  166.   
  167.     def __init__(self):  
  168.         self.name = 'Michael'  
  169.   
  170.     def __getattr__(self, attr):  
  171.         if attr=='score':  
  172.             return 99  
  173.   
  174. #函方法也可用  
  175. class Student(object):  
  176.   
  177.     def __getattr__(self, attr):  
  178.         if attr=='age':  
  179.             return lambda25  
  180.   
  181. >>> s.age()  
  182. 25  
  183.   
  184.   
  185. __call__:  
  186. #任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。请看示例:  
  187.   
  188. class Student(object):  
  189.     def __init__(self, name):  
  190.         self.name = name  
  191.   
  192.     def __call__(self):  
  193.         print('My name is %s.' % self.name)  
  194. #调用方式如下:  
  195.   
  196. >>> s = Student('Michael')  
  197. >>> s()  
  198. My name is Michael.  
  199.   

回复:

还没有人发言哦,来抢沙发吧~

请先登录

说点什么吧~

学堂公告

各位MOOCer大家好 (^-^)V

欢迎来到学堂在线广场~

在这里你可以玩活动,看资讯,晒笔记。

还可以交学友、发心情、聊人生。

在学堂的每一天,就从这里开始吧!

点击 广场指南 了解更多

推荐活动

我要举报
提交