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 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
随机推荐
- html中用div代替textarea实现输入框高度随输入内容变化
项目中的需求:留言栏输入高度变化,超过1行时,自动伸展,超过4行后,不再伸展.主要思想是利用最小高度和最大高度,再加上overflow来实现,到了最大高度,文字不会溢出而是隐藏.根据文本框中字体的大小 ...
- border:none 和border:0区别差异
border:none与border:0的区别体现为两点:一是理论上的性能差异,二是浏览器兼容性的差异. 性能差异: [border:0;]把border设为“0”像素效果等于border-width ...
- Linux系统下设置环境变量
例如我现在有一个软件understand代码审阅软件,现在我每次想要打开这个软件就要进到~/scitools/bin/linux32目录下,去执行可执行文件understand; 但每次都这样我会觉得 ...
- Table 表单
<style> table th { white-space: nowrap; } .chk { white-space: nowrap; } </style> <tab ...
- [Android]优化相关
尽量减少布局的层次,最多10层,可以通过LinearLayout向RelativeLayout的转变来减少层的数量 使用ListView的时候,getView方法中的对象尽量重用
- Ubuntu14.04安装python3.5
Ubuntu14.04系统会自带python2.7,请不要卸载它,不同版本的Python可以共存. #sudo add-apt-repository ppa:fkrull/deadsnakes #su ...
- 华硕win10文档类文件点击右键时会闪一下,没法用右键打开文件
华硕的win10系统,把系统自带的福昕软件Foxit PhantomPDF卸载了就好了
- session
小结
- G:首页调用“图片视频”的分类和文章(难点)
1:后台获取:自定义分类的ID (默认分类也可获取) 2:动态获取"自定义分类的ID($cat)" $cat_title = single_cat_title(' ', f ...
- <section> 标签
最近正在学习html5,刚接触html5,感觉有点不适应,因为有一些标签改变了,特别是div, section article这三个标签,查了一些资料,也试着用html5和css3布局网页,稍微有点头 ...