零基础学PhytonIT@程序员猿媛

Python面向对象编程

2019-05-09  本文已影响1人  墨马

一._ 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

调用方法


上一篇 下一篇

猜你喜欢

热点阅读