13、Python之面向对象进阶篇
1、静态方法
静态方法是指可以被类直接调用的方法,其类似于静态属性,其既可以被类直接调用,也可以被对象调用。在python中使用装饰器@staticmethod来申明某个方法为静态方法,静态方法的实例代码如下:
1 class Grade(object): 2 def __init__(self,name,count): 3 self.__name = name 4 self.__count = count 5 @staticmethod #申明为静态方法 6 def print_grade( ): 7 print("这个类主要是用于创建班级对象") 8 grade = Grade("高一(2)",20)
grade.print_grade()#通过对象直接调用 9 Grade.print_grade()#可以通过类名直接调用
2、类方法
类方法也能被类和对象调用,但其只能访问类属性,不能访问对象属性,在python中使用装饰器@classmethod来申明某个方法为类方法,类方法的实例代码如下:
1 class Grade(object): 2 __grade_count = 1 3 def __init__(self,name,count): 4 self.__name = name 5 self.__count = count 6 @classmethod #申明为类方法 只能访问类属性 7 def grade_count(self): 8 print(self.__grade_count) 9 10 Grade.grade_count()#通过类调用 11 grade = Grade("高一(2)",20) 12 grade.grade_count() #通过对象调用
咋一看类方法和静态方法貌似差不错,其实在java或者C++等高级语言中,只有静态方法,没有类方法。python中新增了类方法想必有其原因,具体原因我还不知道,但是!!!我们仔细观察会发现这两种方法还是有一些区别的:
对于静态方法,系统将不会自动关联self参数,而类方法还是关联的。至于其它的区别,我暂未想到。
3、静态属性
python中可以将一个方法变成一个属性,有些时候,我们通常会将一个属性定义为私有属性,而后提供get和set方法用于对私有属性的访问和赋值操作,这样做固然没有问题,但使用起来不如对公有属性那样方便和直观。为了让我们对私有属性的访问如共有属性一样畅通,可使用装饰器@property家族来完成。
现有这样一个需求,现在有一个学生类,其年龄为私有属性,且年龄字段必须满足以下几个条件:1、用户进行修改时,必须>0,否则修改为0,2、如果年龄为0时,返回100,3,如果年龄字段>0,不可删除,代码实现如下:
1 class Student(object): 2 def __init__(self,name,age): 3 self.__name = name 4 self.__age = age 5 6 @property 7 def age(self): 8 pass 9 @age.setter 10 def age(self,value): #修改 11 if value > 0: 12 self.__age = value 13 else: 14 self.__age = 0 15 def print_selft(self): 16 print("姓名:%s,年龄:%s" % (self.__name,self.__age)) 17 @age.getter #访问 18 def age(self): 19 if self.__age <= 0: 20 return 100 21 else: 22 return self.__age 23 @age.deleter #删除 24 def age(self): 25 if self.__age > 0: 26 pass 27 else: 28 del self.__age 29 stu = Student("高文祥",18) 30 stu.age = 1 31 stu.print_selft() 32 print(stu.age) 33 del stu.age 34 print(stu.age)
装饰器的property的功能主要有以下2点:1、将一个方法变成一个属性 2,通过property.setter、property.getter以及property.deleter对私有属性进行包装。
4、特殊成员变量
1.__str__:对象访问时,系统自动调用的方法,我们可以去重写__str__方法。代码如下:
1 class Student(object): 2 def __init__(self,name,age): 3 self.__name = name 4 self.__age = age 5 def __str__(self): #重写基类方法 6 return self.__name 7 stu = Student("高文祥",20) 8 print(stu) #执行结果:高文祥
2、__setitem__,__getitem__和__delitem__:这组方法能将对对象的操作像对字典一样操作。代码如下:
1 class Student(object): 2 def __init__(self): 3 self.__info = {} 4 def __setitem__(self, key, value): #设置 5 self.__info[key] = value 6 def __getitem__(self, key): #赋值 7 return self.__info[key] 8 def __delitem__(self, key): #删除 9 del self.__info[key] 10 stu = Student() 11 stu["name"] = "高文祥" 12 print(stu["name"]) 13 del stu["name"] 14 print(stu["name"])
3、__new__方法:__new__方法是在初始化之前调用的,且是在__init__方法之前调用的,而后在__new__方法中再去调用__init__方法,代码如下:
1 class Student(object): 2 def __init__(self): 3 print("__init__") 4 def __new__(cls, *args, **kwargs): 5 print("__new__") 6 return cls.__init__(cls) 7 stu = Student() 8 #执行结果 9 # __new__ 10 #__init__
4、其他待补充
1 class Student(object): 2 "这是一个学生类" 3 def __init__(self,name,age): 4 self.name = name 5 self.age = age 6 stu = Student("高文祥",20) 7 print(stu.__doc__,stu.__dict__) #执行结果:这是一个学生类 {'name': '高文祥', 'age': 20}