(python)面向对象进阶
类的成员
类的成员可以分成三大类:字段丶方法和属性
注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。
一丶字段
字段包括:普通字段和静态字段,他们在定义和使用中有区别,而最本质的区别是内存中保存的位置不同
·普通字段属于对象
·静态字段属于类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Province: # 静态字段 country = '中国' def __init__(self, name): # 普通字段 self.name = name # 直接访问普通字段 obj = Province('河北省') print obj.name # 直接访问静态字段 Province.country
由上图可知:
静态字段在内存中只保存一份
普通字段在每个对象中都要保存一份
应用场景:
通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
二丶方法
方法包括,普通方法,静态方法和类方法,三种方法在内存中都归属于类,区别在于调用的方式不同
·普通方法:由对象调用,至少一个self参数,执行普通方法时,将自动调用该方法的对象赋值给self
·类方法:由类调用,至少一个cls参数,执行类方法时,自动调用该方法的类赋值给cls
·静态方法:由类调用,无默认参数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Foo: 2 3 def __init__(self, name): 4 self.name = name 5 6 def ord_func(self): 7 """ 定义普通方法,至少有一个self参数 """ 8 9 # print self.name 10 print '普通方法' 11 12 @classmethod 13 def class_func(cls): 14 """ 定义类方法,至少有一个cls参数 """ 15 16 print '类方法' 17 18 @staticmethod 19 def static_func(): 20 """ 定义静态方法 ,无默认参数""" 21 22 print '静态方法' 23 24 25 # 调用普通方法 26 f = Foo() 27 f.ord_func() 28 29 # 调用类方法 30 Foo.class_func() 31 32 # 调用静态方法 33 Foo.static_func()
相同点:对于所有方法而言,均属于类(非对象)中,所以,在内存中也只保存一份
不同点:方法调用者不同,调用方法时自动传入的参数不同
三丶属性
1.属性的基本使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# ############### 定义 ############### class Foo: def func(self): pass # 定义属性 @property def prop(self): pass # ############### 调用 ############### foo_obj = Foo() foo_obj.func() foo_obj.prop #调用属性
由属性的定义和调用要注意以下几点:
定义时:在普通方法的基础上添加@proprety
定义时:属性仅有一个self参数
调用时:无需括号
方法:foo_obj.func()
属性:foo_obj_prop
注意:属性存在的意义是,访问属性时可以制造出和访问字段完全相同的假象
属性由方法变种而来,如果python中没有属性,完全可以代替其功能
实例:对于主机列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据(即:limit m,n),这个分页的功能包括:
- 根据用户请求的当前页和总数据条数计算出 m 和 n
- 根据m 和 n 去数据库中请求数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Pagenation(object): """ 处理分页相关的代码 """ def __init__(self,page,per_page_num=10): """ 初始化 :param page: 当前要查看的页面 :param per_page_num: 每页默认要显示的数据行数 """ self.page = page self.per_page_num = per_page_num @property def start(self): """ 计算索引的起始位置 :return: """ return (self.page-1) * self.per_page_num @property def end(self): """ 计算索引的结束位置 :return: """ return self.page * self.per_page_num data_list = [] for i in range(1, 901): data_list.append('alex-%s' % i) while True: # 1. 要查看的页面 page = int(input('请输入要查看的页码:')) obj = Pagenation(page) page_data_list = data_list[obj.start:obj.end] for item in page_data_list: print(item)
python的属性功能是:属性内部进行一系列的逻辑运算,最终将计算结果返回
四丶嵌套
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # by luffycity.com 2 """ 3 创建三个学校且三个学校的设施内容等都是一致. 4 """ 5 6 class School(object): 7 def __init__(self, name, address): 8 self.name = name 9 self.address = address 10 11 def speech(self): 12 print('讲课') 13 14 obj1 = School('北京校区', '美丽富饶的沙河') 15 obj2 = School('上海校区', '浦东新区') 16 obj3 = School('深圳校区', '南山区') 17 class Teacher(object): 18 def __init__(self, name, age, salary): 19 self.name = name 20 self.age = age 21 self.__salary = salary 22 self.school = None 23 24 t1 = Teacher('李杰', 19, 188888) 25 t2 = Teacher('艳涛', 18, 60) 26 t3 = Teacher('女神',16, 900000) 27 # ############## 老师分配校区 28 t1.school = obj1 29 t2.school = obj1 30 t3.school = obj2 31 # #################################### 32 # 查看t1老师,所在的校区名称/地址 33 print(t1.school.name) 34 print(t1.school.address) 35 print(t1.name) 36 print(t1.age) 37 t1.school.speech()
·