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}

原文地址:https://www.cnblogs.com/win0211/p/8488292.html

时间: 2024-08-27 09:54:34

13、Python之面向对象进阶篇的相关文章

Python之面向对象进阶

Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 1.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 1 class Province:

Python学习笔记进阶篇——总览

Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(多线程与进程池) Python学习笔记——进阶篇[第九周]———线程.进程.协程篇(队列Queue和生产者消费者模型) Python学习笔记——进阶篇[第九周]———协程 Python学习笔记——进阶篇[第九周]———MYSQL操作

python 面向对象 进阶篇

在上篇<python面向对象>中,简单介绍了python中面向对象的基本知识 在这篇博客中,详细介绍python类的成员,成员修饰符,类的特殊成员. 类的成员 类的成员分为三种:字段,方法和属性 所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 字段 字段包括普通字段和静态字段.静态字段,保存在类中.普通字段,保存在对象中. class FOO: country = “中国

Python基础-面向对象进阶

面向对象进阶 一 类中的装饰器方法  classmethod staticmethod property 1.1 property 一般情况下,方法都是动词.指某一类事物的动作 在计算圆形的周长和面积的时候,他们应该是圆形的属性,但是这里确是一个方法.这不符合python面向对象(能够完全区分属性和方法)的理念. 所以我们可以用一个装饰器去将一个属性性质的函数,装饰成一个属性.可以以调用属性的方式去调用他. from math import pi class Circle: def __init

Python【day7】:Python学习(面向对象进阶、反射、socket介绍)

面向对象进阶 1.类变量和实例变量 # 一.变量 # 变量包括:实例变量和类变量, # 他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, # 实例变量属于对象 # 类变量属于类 class Province(object): country = "中国" #类变量 def __init__(self, name): self.name = name # 实例变量 # 直接访问实例变量(实例名来调用) obj = Province('河北省') print(obj.na

python之路 面向对象进阶篇

一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 country = '中国' def __init__(self, name): # 普通字段 self.name = name # 直接访问普通字段 obj = Province('河北省') print obj.name # 直接访问静态字段 Province.country 由上述代码可以看出[普通字段需

Python面向对象-进阶篇(类的特殊成员)

Python类,存在着一些具有特殊含义的成员,详情如下: 1.__doc__ 表示类的描述信息 class Foo: """ 描述类信息,这是用于看片的神奇 """ def func(self): pass print Foo.__doc__ #输出:类的描述信息  2.__module__ 和 __class__ __module__ 表示当前操作的对象在那个模块__class__   表示当前操作的对象的类是什么 from lib.aa im

面向对象-进阶篇

本篇主要为Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 1 class Province: 2 3 # 静态字段 4 cou

Python之面向对象进阶------反射(Day26)

一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Classmethod_Demo.func() staticmethod class Staticmethod_Demo(): role = 'dog' @staticmethod def func(): print("当普通方法用") Staticmethod_Demo.func() clas