一._ slots _
当定义了class之后创建实例之后可以绑定任意方法和属性
1.当给实例绑定方法,对另一个实例不起作用
2.给class绑定方法之后所有的实例均可调用
为了限制实例的属性定义了_ solots _方法
class Student(object):
_ solts _ = ('name','age')#用tuple定义云粗帮扶夫人的的属性名称
s = Student();
s.score = 99
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
由于'score'没有放入_ solts 中所所以不能绑定score属性,否则会报错。
1.仅对但当前类起作用,其对继承的子类不起作用
2.子类如果定义, solts _,子类允许定义的属性就是自身的加上父类的
二.@property
当我们该需要对输入的数据进行限制就需要如下操作
class Student(object):
def get_score(self):
return self._score
def set_score(self, value):
if not isinstance(value,int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
s = Student()
s.set_store(60);
这样做显然调用方法显然比较复杂,因此就用到了@property
class Student(object):
@property
def get_score(self):
return self._score
@score.setter
def set_score(self, value):
if not isinstance(value,int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
s = Student()
s.score = 60;
只需加上@property就可以把getter方法变成一个属性,此时@property本身又创建了一个@score.setter负责把setter方法编程属性赋.
三._ iter _
如果一个类被用于for...in...循环类似list或tupple那样就需要用到iter方法,该方法返回一个迭代对象,P樱桃红的for循环就会不断调用该迭代对象的_ next _()方法拿到循环的下一个值知道遇到StopIteration错误是退出循环:
一斐波那契数列为例
class Fib(object):
def _ init _(self):
salf.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 > 10000:
raise StopIteration()
return self.a
def _getiteram_(self,n)#像list一样调用第i项
a,b=1,1
for x in range(n):
a,b = b,a+b
return a
for n in Fib():
print(n)
像list一样调用第i项
class fib(object):
def _getiteram_(self,n)#像list一样调用第i项
a,b=1,1
for x in range(n):
a,b = b,a+b
return a
实现list的切片功能
通过上面的方法可以使自定义的类和Python自带的list没有什么区别,其他的功能可以类比此方法自己实现
_ getattr _
当调用不存在的属性的时候就会报错,而实际上在调用一个不存在的属性,python解释器会调用_ getattr _(self,'score')来尝试获得属性,这样就会返回score的值。
class Student(self):
def_getattr_(self,str)
if str == 'score'
return 99
此方法也可以返回函数,当然只有属性不存在才会调用此方法。此方法默认返回None如果只想让class返回特定的几个属性我们可以返回一个报错
raise AttributeError('\'Student\' o bject has no attribute \'%s'\' ' %str )
这样就相当于把所有的属性和方法调用全部动态化处理掉了。
四._ call _
定义call()方法可以直接对实例调用,利用callable识别对象是否可以被调用
def _call_(self):
print('my ame is')
callable(Student())
#ture
五.枚举类型
from enum import Enum
Month = Enum('Month',('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'))
其value属性自动赋值,默认从一开始
如果需要精确定义枚举类型,可以从Enum派生自定义类:
from enum import Enum,unique
@unique
class Weekday(Enum):
Sun = 0#Sun的value被设定为0
Mon = 1
Tue = 2
Web = 3
Thu = 4
Fri = 5
Sat = 6
调用方法
网友评论