本节内容:
1. 面向对象高级语法部分
1.1 静态方法、类方法、属性方法
1.2 类的特殊方法
1.3 反射
2. 异常处理
3. Socket开发基础
1. 面向对象高级语法部分
1.1 静态方法、类方法、属性方法
1) 静态方法
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法。普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法。
1 class Dog(object): 2 3 def __init__(self, name): 4 5 self.name = name 6 7 8 9 @staticmethod # 把eat方法变为静态方法 10 11 def eat(self): 12 13 print("%s is eating" % self.name) 14 15 16 17 18 19 d = Dog("taidi") 20 21 d.eat()
上面的调用会出以下错误,说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。
1 <span style="color: #ff0000;">Traceback (most recent call last): 2 3 File "/Users/jieli/PycharmProjects/python基础/自动化day7面向对象高级/静态方法.py", line 9, in <module> 4 5 d.eat() 6 7 TypeError: eat() missing 1 required positional argument: 'self' 8 9 </span>
想让上面的代码可以正常工作有两种办法:
- 调用时主动传递实例本身给eat方法,即d.eat(d)
- 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了
1 class Dog(object): 2 3 4 5 def __init__(self,name): 6 7 self.name = name 8 9 10 11 @staticmethod 12 13 def eat(): 14 15 print(" is eating") 16 17 18 19 d = Dog("taidi") 20 21 d.eat() 22
2) 类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。
1 class Dog(object): 2 3 def __init__(self, name): 4 5 self.name = name 6 7 8 9 @classmethod 10 11 def eat(self): 12 13 print("%s is eating" % self.name) 14 15 16 17 18 19 d = Dog("taidi") 20 21 d.eat()
执行报错如下,说Dog没有name属性,因为name是个实例变量,类方法是不能访问实例变量的.
1 Traceback (most recent call last): 2 3 File "/Users/jieli/PycharmProjects/python基础/自动化day7面向对象高级/类方法.py", line 16, in <module> 4 5 d.eat() 6 7 File "/Users/jieli/PycharmProjects/python基础/自动化day7面向对象高级/类方法.py", line 11, in eat 8 9 print("%s is eating" % self.name) 10 11 AttributeError: type object 'Dog' has no attribute 'name'
此时可以定义一个类变量,也叫name,看下执行效果:
1 class Dog(object): 2 3 name = "我是类变量" 4 5 6 7 def __init__(self, name): 8 9 self.name = name 10 11 12 13 @classmethod 14 15 def eat(self): 16 17 print("%s is eating" % self.name) 18 19 20 21 22 23 d = Dog("taidi") 24 25 d.eat() 26 27 28 29 # 执行结果 30 31 32 33 我是类变量 is eating 34
3) 属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性
1 class Dog(object): 2 3 def __init__(self, name): 4 5 self.name = name 6 7 8 9 @property 10 11 def eat(self): 12 13 print(" %s is eating" % self.name) 14 15 16 17 18 19 d = Dog("taidi") 20 21 d.eat()
调用会出以下错误,说NoneType is not callable, 因为eat 此时已经变成一个静态属性,不是方法了,想调用已经不需要加()号了,直接d.eat就可以.
d = Dog("taidi") d.eat
输出
taidi is eating
属性方法实例--查询航班
1 class Flight(object): 2 def __init__(self, name): 3 self.flight_name = name 4 5 def checking_status(self): 6 print("checking flight %s status" % self.flight_name) 7 return 1 8 9 @property 10 def flight_status(self): 11 status = self.checking_status() 12 if status == 0: 13 print("航班取消。。。") 14 elif status == 1: 15 print("航班到达") 16 elif status == 2: 17 print("航班延迟") 18 else: 19 print("无法确定航班状态") 20 21 f = Flight("CA980") 22 f.flight_status
现在我只能查询航班状态, 既然这个flight_status已经是个属性了, 那我能否给它赋值呢?
f = Flight("CA980") f.flight_status f.flight_status = 2
输出结果说不能更改这个属性:
1 checking flight CA980 status 2 flight is arrived... 3 Traceback (most recent call last): 4 File "/Users/jieli/PycharmProjects/python基础/自动化day7面向对象高级/属性方法.py", line 58, in <module> 5 f.flight_status = 2 6 AttributeError: can't set attribute
通过@proerty.setter装饰器再装饰一下就可以改了,此时需要一个新方法对这个flight_status进行更改:
1 class Flight(object): 2 def __init__(self, name): 3 self.flight_name = name 4 5 def checking_status(self): 6 print("checking flight %s status" % self.flight_name) 7 return 1 8 9 @property 10 def flight_status(self): 11 status = self.checking_status() 12 if status == 0: 13 print("航班取消。。。") 14 elif status == 1: 15 print("航班到达") 16 elif status == 2: 17 print("航班延迟") 18 else: 19 print("无法确定航班状态") 20 @flight_status.setter # 修改属性方法 21 def flight_status(self, status): 22 status_dic = { 23 0: "取消", 24 1: "到达", 25 2: "延迟", 26 } 27 print("