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)