`
_wyh
  • 浏览: 59415 次
社区版块
存档分类
最新评论

python的定制类

阅读更多

在python中,名字形如__xxx__的函数或方法,可以给类定制一些特殊的属性,使该类的实例在调用方法和属性的时候更简单方便。

下面给Student类添加各种。

class Student(object):
        #下面是各种方法


#实例对象:
stu = Student()

 

 

1,__slots__

 

作用:限制实例的属性范围,要求实例只能给哪几个属性赋值,不能继承给子类

参数:无。这是一个类的属性

    __slots__ = ('name', 'age')



stu.name = "Curry"    # 正确
stu.age = 28     # 正确 
stu.number = 35     # 错误,发生AttributeError异常  

给__slots__赋予了一个不可变的列表。该__slots__是限制Student实例只能有name和age两个属性

 

2,__str__

 

作用:打印实例时,打印出的是该实例__str__方法中返回的字符串。

参数:只有一个self

    def __str__(self):
        return 'this student name is %s, age is %s' % (self.name, self.age)

print(stu)

结果为:

this student name is Curry, age is 28

  

3,__getattr__

 

作用:实例在调用未定义的一个属性或方法时,就会报错,使用getattr可以给这些未定义的属性或方法指定一个默认值

参数:两个,一个是对象本身,self,另一个是attr,为实例调用的该实例不存在的属性的字符串形势。

    def __getattr__(self, attr):
        if attr=='number':
            return 35
        else:
            return attr


print(stu.number)
print(stu.hahahaha)

 结果为:

35
hahahaha

 刚刚在__getattr__中定义了,如果该不存在的属性是number,则返回35,否则,返回该不存在属性本身

 

4,__iter__,__next__ 

 

作用:可以实现实例的迭代,iter返回的是迭代的对象,迭代该实例时,会不断调用next,知道next返回StopIteration

参数:iter和next都是self

    def __iter__(self):
        return self

    def __next__(self):
        self.age += 1
        if self.age > 50:
            raise StopIteration()
        return self.name + str(self.age)


for value in stu:
    print(value)

 结果为:

Curry29
Curry30
Curry31
Curry32
Curry33
Curry34
Curry35
Curry36
Curry37
Curry38
Curry39
Curry40
Curry41
Curry42
Curry43
Curry44
Curry45
Curry46
Curry47
Curry48
Curry49
Curry50
Curry52

 根据next中的定义,只有当self.age>50使,该循环才会结束,否则,按next返回的值依次输出

 

5,__call__

作用:定义一个以实例自己的名字为方法名,直接调用该名字的方法。

参数:self

    def __call__(self):
        print('name is %s, age is %s, number is %s' % (self.name, self.age, self.number))

stu()

 结果为:

name is Curry, age is 29, number is 35

 __call__返回的是该实例当时的name,age等等,如果之前就改变了name, age的值,结果会不同

 

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics