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

廖雪峰Python教程 学习笔记11 面向对象高级编程

2016-10-24 11:29 1081 查看

1,_ slots_ (注意前后各有两个下划线)

定义class时,用来限制class实例能添加的属性

class Animal(object):
__slots__ = ('name','age')
a = Animal()
a.name = 'Dog'
a.age = 10
a.sex = 'M'   #这一句会出错

__slots__ 定义的属性仅对当前类实例起作用,对继承的子类时不起作用的。但如果在子类中也定义了__slots__ 这样,子类实例允许定义的属性就是自身的__slots__ 加上父类的 __slots__


2,@property (注意前面有个@号)

可以使得实例能够以 “对象名.属性名”来访问属性,又可以进行参数检查(如:是否为合法的年龄)
class Student(object):
@property
def age(self):
return self._age
@age.setter
def age(self,value):
if not isinstance(value,int):
raise ValueError('age must be an integer!')
self._age = value


3,多重继承

在Python中,类可以继承多个父类。一般会有一个主要继承的类和若个其它次要或后续添加的类。如‘狗’继承‘动物’,同时也继承‘会跑的事物’。次要继承的类的名称通常被加上MixIn后缀。如:

class Dog(Animal,RunableMixIn):
pass
class Animal(object):
pass
class RunableMixIn(object):
pass


4,定制类

_ str _(注意前后各有两个下划线)

使得print对象时,输出指定信息
class Student(object):
def __init__(self,name):
self.name = name
def __str__(self):
return 'Student object (name: %s)' % self.name

print(Student('Bob'))  #输出: Student object(name: Bob)


_ repr_(注意前后各有两个下划线)

使得在shell直接输入对象名字时也输出指定信息
lass Student(object):
def __init__(self,name):
self.name = name
def __repr__(self):
return 'Student object (name: %s)' % self.name

Student('Bob')  #输出: Student object(name: Bob)


_ iter_(注意前后各有两个下划线)

实现iter()可以使得类能被用于for…in循环,该方法返回一个可迭代对象,for循环会不断地调用该对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

class Fib(object):
def __init__(self):
self.a, self.b = 0, 1

def __iter__(self):
return self

def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > 100000:   #为了for循环能结束
raise StopIteration()
return self.a
#测试代码
for n in Fib():   #输出100000以内的斐波那契数列
print(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python
相关文章推荐