-
我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象。 p1.get_grade 返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade() 才是方法调用。 因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法。 import types p1.get_grade = types.MethodType(fn_get_grade, p1, Person) 给一个实例动态添加方法并不常见,直接在class中定义要更直观。 self.get_grade = lambda: 'A' 这里直接把 lambda 函数赋值给 self.get_grade 和绑定方法有所不同,函数调用不需要传入 self,但是方法调用需要传入 self。查看全部
-
当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。 可见,千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性 print Person.__count打印不出来,提示attributeerror,没有__count这个变量,因为__count是内部的访问限制函数,无法通过外部打印访问。 因此只能通过类内部来访问打印查看全部
-
当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。 千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。 删除属性:del p1.address查看全部
-
实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。 因为类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问。 由于Python是动态语言,类属性也是可以动态添加和修改的。查看全部
-
Person.count = Person.count + 1 要注意等号前后参数的一致性,后面要加上操作符.和类名Person查看全部
-
Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。 但是,如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。 以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。查看全部
-
定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性。 __init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。 __init__()函数除了指定的参数外,还可以使用**kw来定义任意的关键字参数; 除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过 setattr(self, 'name', 'xxx') 设置属性。 def __init__(self,name,gender,birth,**kw): self.name=name self.gender=gender self.birth=birth for k,v in kw.iteritems(): setattr(self,k,v)查看全部
-
根据对象的某个属性排序 sorted(L1,key=lambda x:x.name) sorted(L1,cmp=lambda x,y:cmp(x.name,y.name))查看全部
-
python 安装第三方模块: 1.easy install 2.pip(官方推荐) pip install web.py 安装之后直接import web导入使用。 https://pypi.python.org/ 网站可以搜索模块。查看全部
-
利用ImportError错误,我们经常在Python中动态导入模块: try: from cStringIO import StringIO except ImportError: from StringIO import StringIO try 的作用是捕获错误,并在捕获到指定错误时执行 except 语句。 利用import ... as ...,还可以动态导入不同名称的模块。通过重命名别名而统一。查看全部
-
如果我们只希望导入用到的math模块的某几个函数,而不是所有函数,可以用下面的语句:from math import pow, sin, log 这样只能用包下的这几个函数,其他的都用不了。而且这样很容易名字冲突。 用包名.函数名可以避免名字冲突。也可以给函数起别名,如: from math import log from logging import log as logger Python的os.path模块提供了 isdir() 和 isfile()函数.查看全部
-
引入模块的方法: import 包名.模块名 同名的模块可以放入不同的包中来避免模块名冲突的问题。 包的每一层下面都必需有一个__init.py文件。从而与普通目录区别。查看全部
-
当二进制转换使用较多的时候,可以定义一个int2()的函数,默认把base=2传进去: def int2(x, base=2): return int(x, base) functools.partial可以帮助我们创建一个偏函数,而不需要我们自己定义int2()。 import functools int2 = functools.partial(int, base=2) functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了。查看全部
-
如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中: def log(f): def wrapper(*args, **kw): print 'call...' return f(*args, **kw) wrapper.__name__ = f.__name__ wrapper.__doc__ = f.__doc__ return wrapper 这样写decorator很不方便,因为我们也很难把原函数的所有必要属性都一个一个复制到新函数上,所以Python内置的functools可以用来自动化完成这个“复制”的任务: import functools def log(f): @functools.wraps(f) def wrapper(*args, **kw): print 'call...' return f(*args, **kw) return wrapper 注意:我们始终无法获得原函数的原始参数信息。查看全部
-
Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。 使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。 要让 @log 装饰函数自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用。 这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,否则会出错。查看全部
举报
0/150
提交
取消