首页
课程
计算机
经济管理
外语
大学先修课
社科/法律
文学
创业
更多其他课程
院校
微学位
学堂云
雨课堂
APP下载
课程
广场
App下载
雨课堂
登录
注册
登录
讨论区
讨论详情
【暑期班】计算机科学和Python编程导论
龙永康
2016-08-31 21:42:17
#模块:
#Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。
import
sys
#sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称
hello.py
if
__name__==
'__main__'
:
test()
#当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,
#if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。
#访问权限:
#__xxx__这样的变量是特殊变量,可以被直接引用(public),但是有特殊用途
#_xxx虽然我可以被访问,但是,请把我视为私有变量,不要随意访问(public)
#_xxx和__xxx这样的函数或变量就是非公开的(private)
#类:可以多继承,其它特性类似java,如多态子类覆盖父类方法
class
student(object):
#继承object
#类型判断:type
>>>
import
types
>>> type(
'abc'
)==types.StringType
isinstance:
>>> h = Husky()
>>> isinstance(h, Husky)
True
>>> isinstance(
'a'
, (str, unicode))
True
dir()
#如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list
#类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,
#实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:
>>> len(
'ABC'
)
3
>>>
'ABC'
.__len__()
3
#配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:
>>> getattr(obj,
'z'
,
404
)
# 获取属性'z',如果不存在,返回默认值404
404
>>> hasattr(obj,
'x'
)
# 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj,
'y'
)
# 有属性'y'吗?
False
>>> setattr(obj,
'y'
,
19
)
# 设置一个属性'y'
>>> hasattr(obj,
'y'
)
# 有属性'y'吗?
True
>>> getattr(obj,
'y'
)
# 获取属性'y'
19
#fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
#调用fn()
__slots__
#创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性
>>>
class
Student(object):
...
pass
...
>>> s = Student()
>>> s.name =
'Michael'
# 动态给实例绑定一个属性
>>>
print
s.name
Michael
>>>
def
set_age(
self
, age):
# 定义一个函数作为实例方法
...
self
.age = age
...
>>>
from
types
import
MethodType
>>> s.set_age = MethodType(set_age, s, Student)
# 给实例绑定一个方法MethodType(方法名,实例,参数)
>>> s.set_age(
25
)
# 调用实例方法
>>> s.age
# 测试结果
25
#也可以对类绑定,这样对所有实例起作用
>>>
def
set_score(
self
, score):
...
self
.score = score
...
>>> Student.set_score = MethodType(set_score,
None
, Student)
#__slots__限制类的属性:(__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的)
>>>
class
Student(object):
... __slots__ = (
'name'
,
'age'
)
# 用tuple定义允许绑定的属性名称
...
#@property :通过getter和setter方法
class
Student(object):
@property
def
birth(
self
):
return
self
._birth
@birth
.setter
#只设置setter方法
def
birth(
self
, value):
self
._birth = value
#自定义类:
#__str__:(相当于java重写toString()方法)
<__main__.Student object at
0x109afb190
>
#打印出来的是字符串,实现__str__
>>>
class
Student(object):
...
def
__init__(
self
, name):
...
self
.name = name
...
def
__str__(
self
):
...
return
'Student object (name: %s)'
%
self
.name
...
>>>
print
Student(
'Michael'
)
Student object (name: Michael)
#__iter__:Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值(像list和tuple)
class
Student(object):
def
__init__(
self
):
self
.a,
self
.b =
0
,
1
# 初始化两个计数器a,b
def
__iter__(
self
):
return
self
# 实例本身就是迭代对象,故返回自己
def
next(
self
):
self
.a,
self
.b =
self
.b,
self
.a +
self
.b
# 计算下一个值
if
self
.a >
100000
:
# 退出循环的条件
raise
StopIteration();
return
self
.a
# 返回下一个值
>>>
for
n
in
Fib():
...
print
n
...
1
1
2
3
5
...
46368
75025
#__getitem__:(可像list一样下标访问)
class
Sutdent(object):
def
__getitem__(
self
, n):
a, b =
1
,
1
for
x
in
range(n):
a, b = b, a + b
return
a
#Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数
#__getattr__:(动态返回一个属性、方法,实现后不存在就不报错了,如果存在则不会执行自己实现的)
class
Student(object):
def
__init__(
self
):
self
.name =
'Michael'
def
__getattr__(
self
, attr):
if
attr==
'score'
:
return
99
#函方法也可用
class
Student(object):
def
__getattr__(
self
, attr):
if
attr==
'age'
:
return
lambda
:
25
>>> s.age()
25
__call__:
#任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。请看示例:
class
Student(object):
def
__init__(
self
, name):
self
.name = name
def
__call__(
self
):
print
(
'My name is %s.'
%
self
.name)
#调用方式如下:
>>> s = Student(
'Michael'
)
>>> s()
My name
is
Michael.
B
r
E
D
(
0
)
(
0
)
回复:
还没有人发言哦,来抢沙发吧~
请先
登录
说点什么吧~
学堂公告
各位MOOCer大家好 (^-^)V
欢迎来到学堂在线广场~
在这里你可以玩活动,看资讯,晒笔记。
还可以交学友、发心情、聊人生。
在学堂的每一天,就从这里开始吧!
点击
广场指南
了解更多
推荐活动
我要举报
提交