python学习笔记-(十一)面向对象进阶&异常处理
上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用)。
静态方法
静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法;
说了那么多,估计会有些懵逼,咱们还是直接上代码看下静态方法怎么使用吧!
1.按照正常逻辑编写代码并加上@staticmethod定义静态方法eat:
| 1 2 3 4 5 6 7 8 9 10 | classPeople(object):    def__init__(self,name):        self.name =name     @staticmethod#把eat方法变为静态方法    defeat(self):        print("%s is eating"%self.name) d =People("cc")d.eat() | 
运行上面代码,我们会发现报以下错误:
TypeError: eat() missing 1 required positional argument: 'self'
----------eat需要一个self参数,但调用时却没有传递
so...我们可以得出一个结论:eat变成静态方法后,再通过实例调用时不会自动把实例本身当作一个参数传给self
2.解决办法:
1)调用时主动传递实例本身给eat方法,即d.eat(d)
2)在eat方法中去掉self参数(这也意味着,在eat中不能通过self.调用实例中的其它变量了)
类方法
类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法。
类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。
依然还是原来的代码,把eat变为类方法看下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | classPeople(object):    def__init__(self, name):        self.name =name    @classmethod# 把eat方法变为类方法    defeat(self):        print("%s is eating"%self.name)d =People("cc")d.eat()---------------打印输出-------------------print("%s is eating"%self.name)AttributeError: typeobject'People'has no attribute 'name' | 
报错说明:People没有name属性;
上面说过,类方法只能访问类变量,不能访问实例变量,而name在这里就是实例变量。
我们加上一个类变量试试:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | classPeople(object):    name ="类变量"    def__init__(self, name):        self.name =name    @classmethod# 把eat方法变为类方法    defeat(self):        print("%s is eating"%self.name)d =People("cc")d.eat()--------------------打印输出-------------------类变量 iseating | 
属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性;
依然还是之前的代码,把eat方法变成静态属性看下效果:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | classPeople(object):    name ="请叫我类变量"    def__init__(self, name):        self.name =name    @property# 把eat方法变为静态属性    defeat(self):        print("%s is eating"%self.name)d =People("cc")d.eat()-----------------打印输出--------------------    d.eat()TypeError: 'NoneType'objectisnotcallable | 
这里报错是因为eat已经变成了一个静态属性,当然不能再使用()去调用了,我们直接调用试试:
| 1 2 3 4 | d.eat-------------打印输出------------cc iseating | 
反射
1.反射的定义
根据字符串的形式去某个对象中操作成员
- 根据字符串的形式去一个对象中寻找成员
- 根据字符串的形式去一个对象中设置成员
- 根据字符串的形式去一个对象中删除成员
- 根据字符串的形式去一个对象中判断成员是否存在
2. 反射的函数
- 
getattr(object, name[, default]) 
根据字符串的形式去一个对象中寻找成员
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | classPeople(object):    def__init__(self):        self.name ='cc'    defeat(self):        return'HI'd =People()ret1 =getattr(d,'eat')ret2 =getattr(d,'name')r1 =ret1()print(r1)print(ret2)--------------打印输出----------------HIcc | 
- 
setattr(object, name, value) 
根据字符串的形式去一个对象中设置成员
| 1 2 3 4 5 6 7 8 9 10 11 12 | classPeople(object):    def__init__(self):        self.name ='cc'    defeat(self):        return'HI'd =People()set1 =setattr(d,'age',18)r1 =getattr(d,'age')print(r1)-----------------------打印输出---------------------------18 | 
- 
delattr(object, name) 
根据字符串的形式去一个对象中删除成员
| 1 2 3 4 5 6 7 8 9 10 11 12 | classPeople(object):    def__init__(self):        self.name ='cc'    defeat(self):        return'HI'd =People()del1 =delattr(d,'name')r1 =getattr(d,'name')print(r1)----------------打印输出-------------------AttributeError: 'People'objecthas no attribute 'name' | 
- 
hasattr(object, name) 
根据字符串的形式去一个对象中判断成员是否存在
| 1 2 3 4 5 6 7 8 9 10 11 12 | classPeople(object):    def__init__(self):        self.name ='cc'    defeat(self):        return'HI'd =People()h1 =hasattr(d,'age')h2 =hasattr(d,'name')print(h1,h2)---------------打印输出-----------------FalseTrue | 
异常处理(缺少else和finally)
在之前学习的过程中我们会接触到各式各样的报错信息,编程过程中为了增加友好性,可以抓取相对应的错误并给出提示信息。
常用异常:
更多异常:
常用异常实例:
IndexError(输出指定错误信息并打印错误信息)
| 1 2 3 4 5 6 7 8 9 | dic =[1,2]try:    dic[2]exceptIndexError as e :    print("i got it!\n",e)---------------------------打印输出--------------------------i got it!listindex out of range | 
KeyError(输出指定错误信息并打印错误信息)
| 1 2 3 4 5 6 7 8 9 10 | dic ={'name':'cc'}try:    dic['age']exceptKeyError as e :    print("i got it!\n",e)---------------------------打印输出---------------------------i got it! 'age' | 
ValueError
| 1 2 3 4 5 6 7 8 9 | s1 ='hello'try:    int(s1)exceptValueError as e:    print(e)---------------------------打印输出----------------------------invalid literal forint() with base 10: 'hello' | 
万能异常Exception:(不建议用,不便于调试;可与异常配合使用)
| 1 2 3 4 5 6 7 8 9 | s1 ='hello'try:    int(s1)exceptKeyError as e:    print('键错误')exceptIndexError as e:    print('索引错误')exceptException as e:    print('错误') | 
自定义异常:
| 1 2 3 4 5 6 7 8 9 | classccException(Exception):    def__init__(self,msg):        self.msg =msg    def__str__(self):        returnself.msgtry:    raiseccException("我的异常")exceptccException as e:    print(e)<span style="font-size: 14pt;"> </span> | 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号