文档章节

python 中的内置函数 与 类

ludlows
 ludlows
发布于 2014/10/07 22:55
字数 936
阅读 9
收藏 0

python这种语言的变量命名规则有些奇葩,我相信大家已经遇到过了,比如:__future__。这种特殊的形式表明,这个

变量有特殊的意义,你不可以在自己的代码中创造这类变量。

1.__init__() 构造函数

类似于c++,java等面向对象语言,python 在类的定义中也有构造函数,这就是__init__()

__init__(parameters)中的变量parameter用来构建这个类的变量

例如:

class newclass(object):
"""docsng for newclass"""
    def __init__(self, aStr):
        self.aStr = aStr
	print "constructor is been used. "+self.aStr+" has been created"
hahaha = newclass("hello")

结果就是,constructor is been used. hello has been created

2.__del__() 析构函数

python 不需要进行内存管理,当一个类被扔到垃圾箱(garbage-collected)的时候,这个函数就会发挥功效。但是,你不会知道具体它什么时候起作用,还是远离它比较好。

3说说__init__()被重载(override)的情况

class Bird(object):
    def __init__(self):
        self.hungry = True
    def eat(self):
	if self.hungry:
	    print "Great"
	    self.hungry = False
	else:
	    print "No,thanks"


如果运行如下程序:

aBird = singBird()
aBird.eat()
程序会报错,因为没有了self.hungry这个变量

解决办法为:

class singBird(Bird):
    def __init__(self):
	Bird.__init__(self)
	print "i am singing"



class singBird(Bird):
    def __init__(self):
	super(singBird,self).__init__()
	print "i am singing"


4.简述python类中常用的内置函数

假设我们有一个字典 aDict = {'a': 1,‘b’:2}

__len__(self) 返回序列中收集item的个数 ,对于空的字典,列表,字符串,元组,它们的逻辑值为False 

                      相当于len(aDict)

__getitem__(self,key) 返回与key相对应的值 。相当于aDict[key]

__setitem__(self.key,value) 将与key相对应的值设为value 。相当于aDict[key] = value

__delitem__(self,key) 将key与和key对应的item删掉      del(aDict[key])

对于序列(元组,列表,字符串)aList[-n] 相当于 aList[len(aList)-n]

5.静态方法(staticmethod)和类方法(classmethod)

class myclass(object):
    def smeth():
        print "this is a static method"
    def cmeth(cls):
        print "this is a class method",cls
    cmeth = classmethod(cmeth)

这就是传说中的装饰器 

class myclass(object):
    @staticmethod
    def smeth():
        print "this is a static method"
    @classmethod
    def cmeth(cls):
        print "this is a class method",cls
当你使用@字符时,装饰器(deractor)的使用就更加简便。

调用myclass.smeth() 输出 this is a static method

调用myclass.cmeth() 输出 this is a class method <class '__main__.myclass'>

6.attribute 函数

__getattribute__(slef,name) 当使用名字为name的attribute时自动调用

__getattr__(self,name) 当使用名字为name的attribute时,实际上并不存在名字为name的attribute时,自动调用

__setattr__(self,name,value)赋值自动调用

__delattr__(self,name) 删除自动调用

例如:

class Rectangle(object):
    def __init__(self):
        self.width = 0
        self.heigh = 0
    def __setattr__(self,name,value):
        if name  == 'width':
            self.width =value
        elif name == 'heigh':
            self.heigh = value
        else:
            raise AttributeError
    def __getattar__(self,name):
        if name == 'width':
            return self.width
        elif name == 'heigh':
            return self.heigh
        else:
            raise AttributeError

7. 迭代器Iterator

迭代器的功能非常强大,可以对任何对象进行循环

迭代的方式可以利用next()函数,或是for 循环

利用next()函数要注意:最后一个对象后,再进行next(),会产生StopIteration报错

注意:在python 3.0中,next() 函数变为__next__()

class Fibb(object):
    def __init__(self):
        self.a = 0
        self.b = 1
    def next(self):
        self.a,self.b = self.b, self.a + self.b
        return self.a
    def __iter__(self):
        return self
fib = Fibb()
print next(fib)
print fib.next()

for i in fib:
    if i >800:
        print i 
        break

总而言之,含有__iter__()的类都是可迭代的,

含有next()的类才是迭代器。

所以对可迭代的类可以使用iter()函数

例如:

a =iter("anasiaj")
print a.next()
print a.next()
于是,有的人就会问,自己创造的迭代器,可不可以自己设定结束点呢?

当然可以,StopIteration 就相当于循环中的break

例子如下:

class aIter(object):
    def __init__(self):
        self.value = 0
    def next(self):
        self.value += 1
        if self.value > 15:
            raise StopIteration
        return self.value
    def __iter__(self):
        return self
aList = list(aIter())
print aList









© 著作权归作者所有

共有 人打赏支持
ludlows
粉丝 0
博文 15
码字总数 4195
作品 0
海淀
程序员
私信 提问
我和Python的Py交易》》》》》》 命名空间的小弟作用域

命名空间的小弟作用域 在这要明确一个观点,在Python中万物皆对象,而变量指向的就是对象。 变量可以是 类名,函数名,储存数据的变量…… 对象可以是 类 ,被封装的一段代码(函数),数据…...

BarkingPig
08/01
0
0
Python面向对象之运算符重载

运算符重载只是意味着在类方法中拦截内置的操作,也就是说当类的实例出现在内置操作中,Python自动调用我们的方法,并且我们的方法的返回值变成了相应操作的结果。 关于重载的关键知识点: ...

bigstone2012
06/08
0
0
python locals和globals

locals和globals 标记一下:Dive Into Python 内容 我们先偏离一下 HTML 处理的主题, 讨论一下 Python 如何处理变量。 Python 有两个内置的函数,locals和globals, 它们提供了基于 dictionary...

henosteven
2013/02/20
0
0
(总结)python 3程序开发指南(六)面向对象程序设计

1.在python中每个内置的类、类库以及我们创建的每个类都直接或间接地从最顶层的基类----object类衍生而来。 2.我们可以通过在类中实现len、add方法来支持len()、add()函数 3.python面向对象编...

索隆
2012/04/27
0
0
python locals globals

Python有两个内置的函数,locals() 和globals(),它们提供了基于字典的访问局部和全局变量的方式。 首先,是关于名字空间的一个名词解释。是枯燥,但是很重要,所以要耐心些。Python使用叫做...

Sophia_tj
2014/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

以太坊Token通证或者代币的真正作用是什么?

上一篇文章以太坊(Ethereum)与以太(Ether)中,你应该很好地理解以太坊是如何构建以太坊应用程序网络的,这些应用程序需要一个名为Ether的加密货币来运行。现在是时候引入一个更深层的概念...

笔阁
10分钟前
1
0
PHP - 利用P3P实现跨域

P3P是什么 P3P Platform for Privacy Preferences, 是W3C公布的一项隐私保护推荐标准,以为用户提供隐私保护。 P3P标准的构想是:Web 站点的隐私策略应该告之访问者该站点所收集的信息类型、...

hansonwong
11分钟前
1
0
传统SSM框架之微信授权登陆

1、jdbc.properties (下面瞎写的值) WEIXIN_APP_ID=wx5438496a99c8d26acbWEIXIN_APP_SECRET=d070fjcwiefhwr38942dw 2、获取配置属性 /** * @Author:Mujiutian * @Description:微信参......

木九天
11分钟前
0
0
以太坊(Ethereum)与以太(Ether)为什么容易混淆?

客观的来说,以太坊与以太这两个概念很容易混淆。 当我们听到以太坊Ethereum这个词时,我们通常会将它与加密货币(比如比特币)联系起来。虽然这个定义并不完全错误。但重要的是要理解以太坊...

geek12345
13分钟前
1
0
ROS实操笔记四 msg 和srv

msg: msg files are simple text files that describe the fields of a ROS message. They are used to generate source code for messages in different languages. srv: an srv file descr......

placido
14分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部