13Python之面向对象进阶篇

Posted 中国先疯队队长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13Python之面向对象进阶篇相关的知识,希望对你有一定的参考价值。

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}

 


以上是关于13Python之面向对象进阶篇的主要内容,如果未能解决你的问题,请参考以下文章

测开之面向对象进阶篇・《多态》

测开之面向对象进阶篇・《魔术方法》

测开之面向对象进阶篇・《属性自省》

python 面向对象(进阶篇)

Python之路:面向对象(进阶)

Python进阶---面向对象第三弹(进阶篇)