Python面向对象编程

作者: 墨马 | 来源:发表于2019-05-09 17:35 被阅读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
    

    调用方法


    相关文章

      网友评论

        本文标题:Python面向对象编程

        本文链接:https://www.haomeiwen.com/subject/bwaioqtx.html