您的位置:首页 > 编程语言 > Python开发

Beginning Python Chapter4

2015-12-09 17:39 477 查看
如果在函数的开头写下字符串,他就会作为函数的一部分进行存储,这称为文档字符串,设置文档字符串也可以使用
__doc__
的属性来设置。

def hello():
'this is hello world doc'
print 'hello world'

print hello.__doc__
hello.__doc__ = 'set fibs doc info'
print hello.__doc__
第一次输出结果 this is hello world doc.
第二次输出结果 set fibs doc info


所有的函数都存在返回值,当没有手动指定return参数时,返回结果为None

写在def语句中函数名后面的变量通常叫做函数的形式参数,而调用函数的时候提供的值是实际参数,传递参数时字符串时不可改变的,也无法被修改

def change(str):
print str
str = 'change str info'
print str

str = 'this is my info'
change(str)
print str

输出处结果
this is my info
change str info
this is my info
可以看出在函数内部对str的更改并没有体现出来。


python中没有引用传递的概念,如果想在函数中对一个字符串重新赋值,可以将这个字符串最为函数的返回值(在做切片操作时,返回的始终是一个副本,即一份拷贝),如果不愿意使用返回值返回,可以将要改变的参数放在一个列表中

python同时支持位置参数和关键字参数,调用函数传递参数时,可以根据位置一一对应,也可以使用关键字指定某一个参数的值。

def func(a, b, c):
print 'a=%d,b=%d,c=%d'%(a, b, c)

func(a = 1, c = 3, b = 2)
func(1, 2, 3)
输出结果都为 a=1,b=2, c=3


python也可以指定默认参数,规则同其他语言一样,一旦指定一个参数的默认值,那这个参数后面的参数都必须指定默认值

有些时候让用户提供任意数量的参数是很有用的,即C#中的变长参数,在python中可以通过参数收集来实现,其中
*
标识列表,
**
标识字典

def allparam(a, b, *c):
print a, b
print c

allparam(1, 2, 3, 3, 3, 3)
输出结果
1, 2
(3,3,3,3)


def allparam(a, b, *c, **d):
print a, b
print c
print d

allparam(1, 2, 3, 3, 3, 3, name='king', age=13)
输出结果:
1 2
(3, 3, 3, 3)
{'age': 13, 'name': 'king'}
注意:当指定字典时,name, 和 age 都不能带引号


def allparam(a, b=111, *c, **d):
print a, b
print c
print d

allparam(1, 2, 3, 3, 3, 3, name='king', age=13)
输出结果
1 2
(3, 3, 3, 3)
{'age': 13, 'name': 'king'}


python的类型检查

一般来说使用类型检查会破坏多态性,不建议使用,但是python还是提供这样的方法,函数为isinstance

isinstance(object, classinfo)如果object是classinfo的实例或者子类时,这个方法返回True,否则返回False。为什么不建议使用类型检查呢?唯一能够毁掉多态的就是使用函数显示的检查类型,比如type,isinstance以及issubclass函数等

在旧版本的python中,类和类型之间有很明显的区别,内建的对象是基于类型的,自定义的对象则是基于类的,可以创建类但是不能创建类型,最近版本的python中,事情有了写变化,基本类型和类之间的界限开始模糊了,可以创建内建类型的子类(或子类型),而这些类型的行为更类似与类。

定义类

class fun:
.....
.....


self参数是方法和函数的区别,每个类方法都包含一个self的参数,指向这个类的对象。

在python中函数名称也可以作为左值,也可以在形式上脱离对象调用,在python中将类中的函数重新赋值之后,函数的功能就发生了变化。python中的函数可以作为左值。可以对函数重新赋值。

def changefunc():
print 'change function info'

class FirstClass:
def func(self):
print 'my first class function'

a = FirstClass()
a.func()
a.func = changefunc
a.func()

a = changefunc
b = a
print id(a), id(b)


python并不直接支持私有化,但是有一些小技巧可以达到私有化的效果,为了让方法和特性变得私有(从外部无法访问)只要在他的名字前面加上双下划线即可。

class myclass:
def __function(self, x):
print x
def test(self, x):
self.__function(x)

a = myclass()
a.test(1)
a.__function(2)
AttributeError: myclass instance has no attribute '__function'
私有方法在类外部没法访问,但是在类内可以访问


尽管双下划线有些奇怪,但是看起来像是其他语言中的标准私有方法,真正发生的事情其实是不标准的,类的内部定义中,所有以双下划线开始的名字都被翻译成 单下划线和类名的形式。所以上面的__function

还是可以访问的,只不过需要换种访问的方式。

class myclass:
def __function(self, x):
print x

a = myclass()
a._myclass__function(1)
这种访问方式是可以得。


class myclass:
def __function__(self, x):
print x

a = myclass()
a.__function__(1)
可以访问,不发生异常


如果不需要使用这种方式访问但是又想让其他对象不要访问内部数据,那么可也使用单下划线的方式。前面有下划线的名字不会被带星号的import导入。

python的继承,python继承只需要在括号中指定父类即可,多继承时,直接指定多个父类

class A:
.....
class B:
.....
class C(A,B):
....
....
类C继承类A和类B


如果要查看一个类是否是另一个类的子类,可以使用内建的issubclass函数,如果想要知道已知类的基类,可以使用它的特殊特性
__bases__


多继承时如果多个类中存在同名的函数,则以第一个基类为准。如上A,B中如果存在同名的函数fun

则以A的函数为准。

class A:
def fun(self):
print 'A'

class B:
def fun(self):
print 'B'

class C(A, B):
pass

a=C()
a.fun()
输出结果为 A
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python