Python开发【第七篇】:面向对象二
字段
- class Foo:
- #静态字段(保存在类中)
- CC = 123
- def __init__(self):
- #普通字段(保存在对象中)
- self.name = 'alex'
- def show(self):
- print(self.name)
静态字段的应用:
- class Province:
- def __init__(self,name):
- self.name = name
- country = "中国"
- hn = Province('河南')
- hb = Province('河北')
- sd = Province('山东')
- hlj = Province('黑龙江')
节省内存空间:
- class Province:
- country = "中国"
- def __init__(self,name):
- self.name = name
- hn = Province('河南')
- hb = Province('河北')
- sd = Province('山东')
- hlj = Province('黑龙江')
一般情况:自己访问自己的字段
规则:普通字段只能用对象访问,静态字段用类访问(可以使用对象访问)。
静态字段在代码加载时已经创建。
- print(hn.name)
- print(Province.country)
普通方法、静态方法、类方法
- class Province:
- country = "中国"
- def __init__(self,name):
- self.name = name
- #普通方法,由对象调用执行(方法属于类)
- def show(self):
- # print(self.name)
- print("河北")
- #静态方法,由类调用执行(当方法内部不需要对象中封装的对象)
- @staticmethod
- def f1(arg1,arg2):
- print(arg1,arg2)
- #类方法(静态方法的一种,至少一个参数,自动传递类名),由类调用执行
- @classmethod
- def f2(cls):
- print(cls)
- Province.f1(111,222)
- Province.f2()
- obj = Province("河南")
- obj.show()
- 输出:
- 111 222
- <class '__main__.Province'>
- 河北
单例模式:类方法。
所有的方法属于类:
1、普通方法,至少一个self,对象执行。
2、静态方法,任意参数,类执行(可以对象执行)。
3、类方法,至少一个cls,类执行(可以对象执行)。
类成员属性
- class Pager:
- def __init__(self,all_count):
- self.all_count = all_count
- def all_pager(self):
- a1,a2 = divmod(self.all_count,10)
- if a2 == 0:
- return a1
- else:
- return a1 + 1
- p = Pager(101)
- ret = p.all_pager() #方法
- print(ret)
- class Pager:
- def __init__(self,all_count):
- self.all_count = all_count
- @property
- def all_pager(self):
- a1,a2 = divmod(self.all_count,10)
- if a2 == 0:
- return a1
- else:
- return a1 + 1
- p = Pager(101)
- ret = p.all_pager
- print(ret)
- class Pager:
- def __init__(self,all_count):
- self.all_count = all_count
- #获取
- @property
- def all_pager(self):
- a1,a2 = divmod(self.all_count,10)
- if a2 == 0:
- return a1
- else:
- return a1 + 1
- #设置
- @all_pager.setter
- def all_pager(self,value):
- print(value)
- #删除
- @all_pager.deleter
- def all_pager(self):
- print("del all_pager")
- p = Pager(101)
- ret = p.all_pager
- print(ret)
- p.all_pager = 111
- del p.all_pager
- 输出:
- 11
- 111
- del all_pager
属性:具有方法的写作形式,具有字段访问形式。
- class Pager:
- def __init__(self,all_count):
- self.all_count = all_count
- def f1(self):
- return 123
- def f2(self,value):
- print(value)
- def f3(self):
- print("del")
- foo = property(fget=f1,fset=f2,fdel=f3)
- p = Pager(101)
- ret = p.foo
- print(ret)
- p.foo = "alex"
- del p.foo
- 输出:
- 123
- alex
- del
成员修饰符
- class Foo:
- #__cc私有静态字段
- __cc = 123
- def __init__(self,name,age):
- self.name = name
- #__age私有普通字段
- self.__age = age
- def f1(self):
- print("f1:"+self.name)
- print(self.__age)
- def f3(self):
- print(Foo.__cc)
- @staticmethod
- def f4():
- print("staticmethod:",Foo.__cc)
- class Bar(Foo):
- def f2(self):
- print(self.name)
- #私有普通字段 不能访问
- # print(self.__age)
- obj = Foo('alex',19)
- print(obj.name)
- # print(obj.age) 不能外部调用
- # print(Foo.__cc) 不能外部调用
- obj.f1()
- obj.f3()
- Foo.f4()
- obj1 = Bar("tom",20)
- obj1.f2()
- obj1.f1()
私有:只有类本身成员内部可以访问。
注意:特殊访问私有字段的方法(_类名__xxx)。
print(obj._Foo__age)
特殊成员
- class Foo:
- #构造方法
- def __init__(self):
- print("init")
- #析构方法
- def __del__(self):
- print("del")
- def __call__(*args,**kwargs):
- print("call")
- p = Foo()
- #获取类名
- print(p.__class__)
- #执行call方法
- p()
- #执行call方法
- Foo()()
- 输出:
- init
- <class '__main__.Foo'>
- call
- init
- call
- del
- del
- class Foo:
- #构造方法
- def __init__(self,name,age):
- self.name = name
- self.age = age
- #析构方法
- def __del__(self):
- pass
- def __call__(*args,**kwargs):
- print("call")
- def __str__(self):
- return "%s----%d" %(self.name,self.age)
- obj = Foo("alex",34)
- print(obj)
- obj2 = Foo("eric",23)
- print(obj2)
- 输出:
- alex----34
- eric----23
- obj1 = Foo('alex',23)
- obj2 = Foo('eric',21)
- #获取对象中封装的数据
- ret = obj1.__dict__
- print(ret)
- 输出:
- {'age': 23, 'name': 'alex'}
- class Foo:
- #构造方法
- def __init__(self,name,age):
- self.name = name
- self.age = age
- #析构方法
- def __del__(self):
- pass
- def __call__(*args,**kwargs):
- print("call")
- def __str__(self):
- return "%s----%d" %(self.name,self.age)
- def __getitem__(self,item):
- print("getitem")
- def __setitem__(self, key, value):
- print("setitem")
- def __delitem__(self, key):
- print("delitem")
- obj = Foo('alex',18)
- #call方法
- obj()
- obj["abc"] = 111
- del obj['abc']
- 输出:
- call
- setitem
- delitem
- class Foo:
- #构造方法
- def __init__(self,name,age):
- self.name = name
- self.age = age
- def __getitem__(self,item):
- print(type(item))
- if type(item) == str:
- pass
- else:
- print(item.start)
- print(item.stop)
- print(item.step)
- print("getitem")
- def __setitem__(self, key, value):
- print(type(key),type(value))
- print("setitem")
- def __delitem__(self, key):
- print(type(key))
- print("delitem")
- obj = Foo('alex',14)
- #getitem
- ret1 = obj[1:4:2]
- #getitem
- ret2 = obj['abc']
- obj[1:3] = [11,22,33]
- del obj[1:5]
- 输出:
- <class 'slice'>
- 1
- 4
- 2
- getitem
- <class 'str'>
- getitem
- <class 'slice'> <class 'list'>
- setitem
- <class 'slice'>
- delitem
- class Foo:
- """
- def __iter__(self):
- print("iter")
- return iter([11,22,333])
- """
- def __iter__(self):
- yield 1
- yield 2
- obj = Foo()
- for item in obj:
- print(item)
- 输出:
- """
- iter
- 11
- 22
- 333
- """
- 1
- 2
- class Bar:
- pass
- class Foo():
- pass
- obj = Foo()
- #查看某个对象是不是由某个类创建
- ret = isinstance(obj,Foo)
- ret2 = isinstance(obj,Bar)
- print(ret)
- print(ret2)
- 输出:
- True
- False
isinstance和issubclass
- class Bar:
- pass
- class Foo(Bar):
- pass
- obj = Foo()
- #查看某个对象是不是由某个类创建
- ret = isinstance(obj,Foo)
- ret2 = isinstance(obj,Bar) #obj类型和obj类型的父类
- print(ret)
- print(ret2)
- #查看某个类是不是另一个类的子类
- ret3 = issubclass(Bar,Foo)
- ret4 = issubclass(Foo,Bar)
- print(ret3)
- print(ret4)
- 输出:
- True
- True
- False
- True
继承super
- class C2(C1):
- def f1(self):
- #执行C1中的f1
- super(C2,self).f1() #C1.f1(self)
- print('c2.f1')
- obj = C2()
- #默认执行C2中的f1
- obj.f1()
- 输出:
- c1.f1
- c2.f1
有序字典
- class MyDict(dict):
- def __init__(self):
- self.li = []
- super(MyDict,self).__init__()
- def __setitem__(self,key,value):
- self.li.append(key)
- super(MyDict,self).__setitem__(key,value)
- def __str__(self):
- temp_list = []
- for key in self.li:
- value = self.get(key)
- temp_list.append("'%s':%s"%(key,value))
- temp_list = "{" + ",".join(temp_list) + "}"
- return temp_list
- obj = MyDict()
- obj['k1'] = 123
- obj['k2'] = 456
- print(obj)
单例模式
单例模式用来创建单个实例。
- class Foo:
- instance = None
- def __init__(self,name):
- self.name = name
- @classmethod
- def get_instance(cls):
- #cls类名
- if cls.instance:
- print("已经创建对象")
- return cls.instance
- else:
- #创建对象
- obj = cls('alex')
- print("新创建对象")
- cls.instance = obj
- return obj
- obj = Foo.get_instance()
- obj1 = Foo.get_instance()
- print(id(obj),id(obj1))
- 输出:
- 新创建对象
- 已经创建对象
- 7225864 7225864
异常处理
- while True:
- num1 = input("num1:")
- num2 = input("num2:")
- try:
- num1 = int(num1)
- num2 = int(num2)
- result = num1 + num2
- except Exception as ex: #捕获所有错误
- print(ex)
- except ValueError as ve: #捕获ValueError
- print(ve)
- except IndexError as ie: #捕获IndexError
- print(ie)
- except Exception as ex: #捕获所有错误
- print(ex)
- try:
- pass
- except ValueError as ve:
- print(ve)
- except Exception as ex:
- print(ex)
- finally: #不管有无错误都执行finally
- pass
- try:
- raise ValueError('主动触发错误')
- pass
- except ValueError as ve:
- print("ValueError",ve)
- except Exception as ex:
- print(ex)
- finally: #不管有无错误都执行finally
- pass
- 输出:
- ValueError 主动触发错误
断言
- assert 1 == 1
- #报错
- assert 1 == 2
Python开发【第七篇】:面向对象二的更多相关文章
- Python开发【第一篇】:目录
本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...
- Python开发【第二篇】:初识Python
Python开发[第二篇]:初识Python Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...
- Python开发【第一篇】:目录
本系列博文包含Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习Python编程的朋友们提供一点帮助! .Python开发[第一篇]:目录 .Python开发[第二篇]:初始P ...
- Python开发【第一篇】基础题目二
1 列表题 l1 = [11, 22, 33] l2 = [22, 33, 44] # a. 获取l1 中有,l2中没有的元素 for i in l1: if i not in l2: # b. 获取 ...
- Python开发【第一篇】:初识Python
初识python 一.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
- 跟着老男孩教育学Python开发【第一篇】:初识Python
Python简介 Python前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
- 七丶人生苦短,我用python【第七篇】
模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个 ...
- Python开发【第二篇】:初始Python
Python的前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,中国人称他为龟叔,他在圣诞节期间在阿姆斯特丹为了打发时间,决定开发一个新的脚本 ...
- python学习第一天:window安装python开发环境完整篇
我是跟着廖雪峰老师的的博客来一步一步来进行学习和实践后记录下来的,讲的非常地详细,推荐大家一起学习https://www.liaoxuefeng.com/wiki/0014316089557264a6 ...
- 【python自动化第七篇:面向对象进阶】
知识点概览: 静态方法,类方法,属性方法 类的特殊方法 反射 异常处理 socket开发基础 一.静态方法:@staticmethod 只是名义上归类管理,实际上在静态方法里访问不了类或者实例中的任何 ...
随机推荐
- (33)关于django中路由自带的admin + 建表关系的讲解
admin是django自带的后台管理,在初始的时候就默认配置好了 当输入ip地址的时候后面跟admin,就会登陆管理员的后台,这个是django自带的,可以快速管理数据表(增删改查) PS:ip地址 ...
- (27)session(设置值、取值、修改、删除)
session的由来 Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西, ...
- 移动Web端资源整合
meta篇 viewreport 视窗宽度 <meta name="viewport" content="width=device-width,initial-sc ...
- Java面向对象 第2节 Scanner 类和格式化输出printf
§Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 1.创建 Scanner 对象的基本语法:Scanner s = ...
- 第1章 Java语言概述--HelloWorld--环境搭建
SE学什么 第1章 Java语言概述 第2章 基本语法 第3章 数组 第4章 面向对象编程(上) 第5章 面向对象编程(中) 第6章 面向对象编程(下) 第7章 异常处理 第8章 枚举类&注解 ...
- [转]MyBatis动态传入表名、字段名参数的解决办法
一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...
- 第三章 C#程序结构(3.1 顺序与选择结构)
[案例]输入某一学生的成绩,输出其对应的档次.具体规定:90分以上为优秀,80分以上至89分为良好,70分至79分为一般,60分至69分为合格,59以下为不及格.如果输入的分数小于0或大于100,则输 ...
- TCP/IP学习20180701-数据链路层-IP子网寻址
IP-子网寻址IP地址是:网络号+主机号现在主机号都要求有子网号所以IP地址就变成了网络号+子网号+主机号例如一个B类地址:210.30.109.134210.30是网络号109是子网号134是主机号 ...
- jvm--深入理解java虚拟机 精华总结(面试)(转)
深入理解java虚拟机 精华总结(面试)(转) 原文地址:http://www.cnblogs.com/prayers/p/5515245.html 一.运行时数据区域 3 1.1 程序计数器 3 1 ...
- [UE4]ProgressBar,进度条
准备好2张进度条图片 一.新建名为“testProgress”的UserWidget,添加一个名为“ProgressBar_0”的ProgressBar到默认容器Canvas Panel 二.进度条进 ...