python之面向对象
首先我们应该知道,python在设计之初就已经是一门面向对象的语言,所以说python中创建一个类和对象是很容易的。
面向对象的技术简介
- 类(class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不做实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及实例对象的相关数据。
- 方法重写:如果从父类继承的方法不能够满足子类的需求,可以对其进行改写,这个过程的方法叫覆盖,也称方法的重写。
- 实例变量:定义在方法中的变量,只用于当前实例中的类。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类中定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
创建类
创建类,class是关键字,就好比函数中的def 一样。基本格式如
class ClassName:
def 函数名(self):
pass
obj = ClassName()
obj.函数名() #执行
创建类中,函数后面的self是必写的参数,相当于传的对象,而obj此时代表的就是一个对象。例如一个简单实例
class foo:
def f(self, args): return args
s = foo()
ret = s.f("你很帅")
print(ret)
面向对象的三大特性:封装、继承、多态
封装
就是把内容封装在某处,日后好调用。首先看一个例子
class foo:
def f(self,args):
print(self.name, self.age, self.gender,args)
z = foo()
z.name = "flash"
z.age = 18
z.gender = "man"
z.f("你很帅") #这种也能实现封装的功能,但是会传很多参数,显得比较low
其实在类中有种自带的特殊的方法:构造方法,这让我们实现封装会比较方便和美观了。如
class Person:
def __init__(self, name, age):
self.n = name
self.a = age
def foo(self):
print(self.n, self.a) flash = Person("Flash",20)
flash.foo() #注:此时的__init__是构造方法,他会根据类创建的时候自动执行。
继承
和现实中的继承类似,都是子类继承父类。继承中默认是全部继承过来,但也可以只继承优点。首先看一个全部继承的例子。
class Father:
def eat(self):
print("吃饭")
def drink(self):
print("喝水") class Son(Father):
def sink(self):
print("la") obj = Son()
obj.sink()
obj.eat()
obj.drink()
全部继承
有时我们不想全部继承,这是我们只需要修改一下就行
class Father:
def eat(self):
print("吃饭")
def drink(self):
print("喝水") class Son(Father):
def drink(self):
print("la")
super(Son, self).drink()#执行父类中的drink的方法
obj = Son()
obj.drink()
部分继承
那么问题来了,如果一个子类有两个父类,每个父类又各有自己的父类,他们的父类又有相同父类怎么办?
在python中遵循先左后右,一条道走到黑,有相同父类时,父类最后执行的原则。

例如下面这个例子
class base:
pass
class F2(base):
def a(self):
print("f2.a")
self.b()
def b(self):
print("f2.b")
class F3(F2):
def b(self):
print("f3.b")
class Son(F3,F2):
pass obj = Son()
obj.a()
多继承
多态
类成员的字段和方法
应用场景
如果对象中需要保存一些值,执行某功能时,需要使用对象中的值 -> 普通方法
不需要任何对象中的值,静态方法
字段
- 普通字段:保存在对象中,执行只能通过对象访问。
- 静态字段:保存在类中, 执行 可以通过对象访问 也可以通过类访问。
方法
- 普通方法,保存在类中,由对象来调用,self=》对象
- 静态方法,保存在类中,由类直接调用
- 类方法,保存在类中,由类直接调用,cls=》当前类
属性
按方法的方式去定义,按字段的模式去调用
例如
class provice:
country = "中国" #静态字段属于类
def __init__(self,n):
self.name = n #普通字段属于对象 henan
print(self.name) henan = provice("河南")
print(provice.country)
henan.name
字段
class Foo:
def f1(self): #普通方法
print(123) @staticmethod #静态方法
def sta():
print(1,2) @classmethod #类方法
def classmd(cls):
print("a,b") @property #属性
def per(self):
print("aaa")
obj = Foo()
obj.f1() Foo.sta() #调用静态方法,不用创建对象 Foo.classmd() #调用类方法 obj1 = Foo() #调用属性
obj1.per
方法
例如用常用的property属性求分页的问题
class Paragnation:
def __init__(self,page):
try:
p = int(page)
except Exception as e:
p = 1
self.page = p
@property
def start(self): p = (self.page -1) * 10
return p
@property
def end(self): p = self.page * 10
return p
li = []
for i in range(1000):
li.append(i)
while True:
p = input("请输入页码:")
obj = Paragnation(p)
print(li[obj.start:obj.end])
property
成员修饰符
- 共有成员
- 私有方法
其中私有成员的表示方法为:双下划线+字段名(__字段名)
私有成员外部不能访问,外部若访问,只能通过类里面的方法间接访问。例如
class F:
def __init__(self):
self.__age = 18
def Show(self):
return self.__age class S(F):
def __init__(self, name, gender):
self.name = name
self.gender = gender
super(S, self).__init__() def show(self):
print(self.name)
# print(self.__age) #子类不能继承到父类的私有变量,否则会报错,如果要继承可以通过父类的共有方法间接访问
print(self.gender) P = S("flash","男")
P.show()
r = P.Show()
print(r)
私有方法
注:子类继承不了父类的私有方法,也就是说,在子类中不能直接访问父类的私有方法,只能通过父类的方法间接去访问。
python中常见的特殊成员
__init__ 类()自动执行
__del__ del 对象[222]
__call__ 对象() 类()() 自动执行
__int__ int(对象)
__str__ str() __add__ #对象的封装的加法
__dict__ # 讲对象中封装的所有内容通过字典的形式返回
__getitem__ # 切片(slice类型)或者索引
__setitem__
__delitem__ __iter__
# 如果类中有 __iter__ 方法,对象=》可迭代对象
# 对象.__iter__() 的返回值: 迭代器
# for 循环,迭代器,next
# for 循环,可迭代对象,对象.__iter__(),迭代器,next
# 1、执行li对象的类F类中的 __iter__方法,并获取其返回值
# 2、循环上一步中返回的对象
异常处理
常用语数据库处理
主要语法块
try:
自定义内容
except Exception as e:
print("消息")
下面列出几种常见模式
try:
i = int(input("输入>>>>")) except IndexError as e:
print("IndexError", e)
except ValueError as e:
print("ValueError",e)
except Exception as e:
print("Exception",e)
else:
print(i)
finally:
print("success")
class Foo(Exception):
def __init__(self,msg):
self.message = msg def __str__(self):
return self.message
try:
raise Foo("I'm error")
except Foo as e:
print(e)
自定义模块
反射
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
def show(self):
print("%s-%s" % (self.name, self.age)) obj = Foo("flash", 18)
# print(obj.name) func = getattr(obj, "name")
print(func)
func1 = getattr(obj, "show")
print(func1()) print(hasattr(obj, "name")) setattr(obj, "gender", "man")
print(obj.gender) delattr(obj, "name")
obj.name
例子
单例模式
class Foo:
V = None @classmethod
def func(cls):
if cls.V:
return cls.V
else:
cls.V = Foo()
return cls.V obj = Foo.func()
print(obj.V)
print(obj)
obj1 = Foo.func()
print(obj1)
例子
python之面向对象的更多相关文章
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- Python的面向对象3
接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...
- Python的面向对象2
我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...
- Python的面向对象1
今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++ ,Java ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...
- My way to Python - Day05 - 面向对象-思维导图
My way to Python - Day05 - 面向对象 思维导图
- Python进阶---面向对象的程序设计思想
Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- Python之面向对象一
引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python基础——面向对象进阶
python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...
- python基础——面向对象的程序设计
python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
随机推荐
- 2016福州大学软件工程第五、六次团队作业-Alpha阶段成绩汇总
1.本次作业成绩统计结果: 本次Alpha阶段团队作业公布如下: 表格说明: PE:贡献百分比 YS:演示评分(满分15分) BK:博客评分(满分15分) SH:事后诸葛亮环节(满分5分) P:个人分 ...
- HDU3394:Railway
传送门 点双练习. 对于一张图,询问有多少条边不属于任意一个点双和多少条边至少属于两个点双. 显然,一张图里有多少个桥就是第一问的答案. 对于第二问,考虑对于一个点双,如果其中的边数等于点数,那么这个 ...
- SNMP Tutorial
Applications: Internet Management (SNMP) 30.1 Introduction 30.2 The Level Of Management Protocols 30 ...
- ig WebDataGrid清除选中行
EnableViewState="false" gridID.Behaviors.Selection.SelectedRows.Clear();
- Linux基础知识整理
一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ...
- 用uniq来处理文件重复数据--交集,差集,计数等(转)
经常有这样的需求:两个文本文件要求取重复的行或只取不重复的,简单的情况下用sort和uniq来处理是非常方便的: 利用现存两个文件,生成一个新的文件 取出两个文件的并集(重复的行只保留一份) 取出两个 ...
- 现代软件工程作业 github使用
Github使用 版本库的创建与同步 第一步:创建远程版本库并同步到本地 创建远程版本库 在地址栏输入www.github.com 并sign in 进入到个人主页,如下图示: 创建远程版本库:点击N ...
- 成功开发iPhone软件的10个步骤
总结 几条要注意的原则: 1.了解你的用户,并与他们接触.交谈. 2.不要做虚幻的想象的设计,多从成功软件中汲取经验. 3.软件要设计得“小”. 4.找到足够多的设计方案,通过数量的累计来得到好的质量 ...
- OPP Services Log
SELECT FCPP.CONCURRENT_REQUEST_ID REQ_ID, FCP.NODE_NAME, FCP.LOGFILE_NAME FROM FND_CONC_PP_ACTIONS ...
- JavaScript对象详解
JavaScript中的数据类型作为javascript的核心,我们经常要用到,也是最基础的. javascript中有非常复杂的数据类型:包括对象(Object)数据类型,还有五个基本数据类型(N ...