python基础学习18----面向对象简述
这里就不再讲面向对象的相关概念知识或者与面向过程的比较了,直接进入类的学习
1.类的创建
class people: def __init__(self):#构造函数
pass sfencs=people()#类的实例
2.封装
class people: def __init__(self,name,age):
self.name=name
self.age=age sfencs=people("sfencs",19)
print("%s is %d"%(sfencs.name,sfencs.age))
3.继承
class father:
def __init__(self):
self.a = 1
self.b = 2 def me(self):
print("i am father")
print(self)#<__main__.son object at 0x000001F7DFA11128> class son(father): def __init__(self):
super().__init__()
super(son,self).me()#执行父类的me方法,但self是people def me(self):
print("i am son") people=son()
print(people.a)#1
people.me()#i am son
子类可以对父类的方法进行重写,子类调用父类的方法使用super(子类名,self),self永远是执行该方法的调用者
python支持多继承
class father1:
def __init__(self):
self.a = 1
self.b = 2 def me(self):
print("i am father1") class father2:
def __init__(self):
self.c = 3
self.d = 4 def me(self):
print("i am father2") class son(father1,father2): def __init__(self):
father1.__init__(self)
father2.__init__(self)
super(son,self).me()#i am father1 def me(self):
print("i am son") people=son()
print(people.c)#3
people.me()#i am son
多继承中子类调用父类方法的寻找方法是按照父类声明的顺序从左到右,从下到上查找,一直查找到最高级的父类,但是如果不同的父类继承于同一个父类,
那么这个相当于根的父类为最后再去查找
4.多态
python原生多态,不像java,c++那样必须在方法的形参处申明类型
5.静态字段与静态方法
sex="male"为静态字段,可以通过对象访问 也可以通过类访问
self.name=name self.age=age 为普通字段只能通过对象访问
class people: sex="male"
def __init__(self,name,age):
self.name=name
self.age=age sfencs=people("sfencs","19")
print(sfencs.name)
print(sfencs.sex)
print(people.sex)
静态方法可以通过对象访问 也可以通过类访问,声明静态方法的方式为@staticmethod
class people: sex="male"
def __init__(self,name,age):
self.name=name
self.age=age
@staticmethod
def func():
print("这是静态方法") sfencs=people("sfencs","19")
sfencs.func()
people.func()
类方法也可以通过对象访问 也可以通过类访问,声明类方法的方式为@classmethod,类方法的参数为类
class people: sex="male"
def __init__(self,name,age):
self.name=name
self.age=age
@classmethod
def func(cls):
print("这是类方法")
print(cls)#<class '__main__.people'> sfencs=people("sfencs","19")
sfencs.func()
people.func()
6.属性
属性定义的时候像方法,使用的时候像字段,使用@property声明,这样就可以使sfencs.func有对应的值
class people: def __init__(self,name,age):
self.name=name
self.age=age
@property
def func(self):
return 1 sfencs=people("sfencs","19")
print(sfencs.func)#1
既然要伪装成字段,那么不仅仅是能够有对应的值,也应该能够为它赋值,将它删除等操作
class people: def __init__(self,name,age):
self.name=name
self.age=age
@property
def func(self):
return 1
@func.setter
def func(self,val):
print(val) @func.deleter
def func(self):
print("del") sfencs=people("sfencs","19")
print(sfencs.func)#1
sfencs.func=123
del sfencs.func
@func.setter为设置赋值的方法,@func.deleter为删除设置的方法。
经过这些设置之后,看似func成立一个字段,有了相应的特点,但其实这些特点都是假的。这三种方式只是3中对应关系,只是使用时是模仿字段操作,但真实操作是由
自己规定的,del并不能真的删除,而只是按照你所写的方法做相应的动作。
除此之外属性还有一种设置方式
class people: def __init__(self,name,age):
self.name=name
self.age=age def f1(self):
return 1 def f2(self,val):
print(val) def f3(self):
print("del") func=property(fget=f1,fset=f2,fdel=f3,doc="描述") sfencs=people("sfencs","19")
print(sfencs.func)#1
sfencs.func=123
del sfencs.func
只是方式改变了,效果还一样,不多说了。
7.成员修饰符
这里就指将成员声明为私有的
class people: def __init__(self,name,age):
self.name=name
self.__age=age
def getage(self):
return self.__age
sfencs=people("sfencs","19")
#print(sfencs.__age)私有成员不能直接通过对象来拿
print(sfencs.getage())#19
当然也有私有方法
class people: def __init__(self,name,age):
self.name=name
self.__age=age
def getage(self):
return self.__age
def __fun(self):
print("这是私有方法")
def func(self):
self.__fun()
sfencs=people("sfencs","19")
#print(sfencs.__age)私有成员不能直接通过对象来拿
print(sfencs.getage())
#sfencs.__fun()
sfencs.func()
在继承当中,私有成员与方法是不能被子类继承的
8.特殊成员方法
__init__
构造方法,这个不用过多解释
__del__
析构方法,当对象在内存中被释放时,自动触发执行
def __del__(self):
pass
__call__
对象后面加括号,触发执行
class people: def __init__(self,name,age):
self.name=name
self.__age=age def __call__(self,a,b):
print("__call__")
print(a,b) sfencs=people("sfencs",19)
sfencs(1,2)
__int__
调用int(对象)时使用的方法
class people: def __init__(self,name,age):
self.name=name
self.__age=age def __int__(self):
return 10 sfencs=people("sfencs",19)
data=int(sfencs)
print(data)#10
__str__
那么在打印 对象 时,默认输出该方法的返回值
class people: def __init__(self,name,age):
self.name=name
self.__age=age def __str__(self):
return "hello world" sfencs=people("sfencs",19)
print(sfencs)#hello world
__add__
两个对象相加执行该方法
class people: def __init__(self,name,age):
self.name=name
self.age=age def __add__(self,other):
return self.age+other.age sfencs=people("sfencs",19)
Tom=people("Tom",20)
print(sfencs+Tom)#39
__dict__
查看类或对象中的所有成员
class people: sex="male"
def __init__(self,name,age):
self.name=name
self.age=age sfencs=people("sfencs",19)
print(sfencs.__dict__)#{'name': 'sfencs', 'age': 19}
print(people.__dict__)
#{'__module__': '__main__', 'sex': 'male', '__init__': <function people.__init__ at 0x000001B6C6F2C2F0>, '__dict__': <attribute '__dict__' of 'people' objects>, '__weakref__': <attribute '__weakref__' of 'people' objects>, '__doc__': None}
__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分别表示获取、设置、删除数据
class people: def __init__(self,name,age):
self.name=name
self.age=age def __getitem__(self, key):
print('__getitem__', key)
return 2 def __setitem__(self, key, value):
print('__setitem__', key, value) def __delitem__(self, key):
print('__delitem__', key) sfencs=people("sfencs",19)
sfencs["one"]=1#__setitem__ one 1
print(sfencs["one"])#__getitem__ one 2
del sfencs["one"]#__delitem__ one
__iter__
class people: def __init__(self,list):
self.list=list def __iter__(self):
return iter(self.list) sfencs=people([1,2,3,4,5]) for i in sfencs:
print(i)
__module__ 和 __class__
表示当前操作的对象在那个模块
class people: def __init__(self,name,age):
self.name=name
self.age=age sfencs=people("sfencs",19)
print(sfencs.__module__)#__main__
print(sfencs.__class__)#<class '__main__.people'>
9.类的另一种创建方式
def f(self):
print(self.name,self.age) def __init__(self,name,age):
self.name = name
self.age = age people = type('people',(object,),{'func':f, '__init__':__init__}) sfencs=people("sfencs",19)
sfencs.func()
这种方式可以看出,类也是一种对象,是type类型的对象
我们可以从下面这张图看出类的实际创建过程
10.反射
反射可以通过字符串的方式来找到对象中的变量或方法
反射有4个方法getattr() hasattr() setattr() delattr()
class people: def __init__(self,name,age):
self.name=name
self.age=age sfencs=people("sfencs",19)
data1=getattr(sfencs,"name")
print(data1)#sfencs
data2=hasattr(sfencs,"age")
print(data2)#True
setattr(sfencs,"age",20)
print(sfencs.age)#20
delattr(sfencs,"age")
data3=hasattr(sfencs,"age")
print(data3)#False
python一切事物皆是对象,模块同样也支持反射来操作
11.单例模式
对象也叫实例,单例模式表示该类只有一个对象
class ConnectPool:
__instatnce=None
@staticmethod
def get_instance():
if ConnectPool.__instatnce:
return ConnectPool.__instatnce
else:
ConnectPool.__instatnce = ConnectPool()
return ConnectPool.__instatnce obj =ConnectPool.get_instance()
print(obj)#<__main__.ConnectPool object at 0x000002523F0174E0>
obj1 =ConnectPool.get_instance()
print(obj1)#<__main__.ConnectPool object at 0x000002523F0174E0>
print(obj1==obj)#True
python基础学习18----面向对象简述的更多相关文章
- python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- python基础学习 Day19 面向对象的三大特性之多态、封装
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- python基础学习笔记——面向对象初识
面向对象初识 python中一切皆对象. 类有两种: 新式类:在py3中所有类都是新式类 经典类:在py2中只有类本身继承了object类才叫做新式类,默认是经典类 class Person: cou ...
- python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)
一.类 先看一段代码: class Person: animal = '高级动物' walk_way = '直立行走' # 静态属性,静态变量,静态字段 language = '语言' def __i ...
- Day1 Python基础学习
一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...
- Day1 Python基础学习——概述、基本数据类型、流程控制
一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...
- Python 基础学习 总结篇
Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...
- python基础学习8
python基础学习8 内容概要 字典的内置方法 元组的内置方法 集合的内置方法 垃圾回收机制 内容详情 字典的内置方法 一.类型转换 res = dict(name='jason', pwd=123 ...
- python基础学习7
python基础学习7 内容概要 字符串的内置方法 字符串的内置方法(补充) 列表的内置方法 可变类型与不可变类型 队列与堆栈 内容详情 字符串的内置方法 # 1.strip 移除字符串首尾的指定字符 ...
随机推荐
- jquery完成界面无刷新加载登陆注册
昨天公司说官网的登陆注册每次要跳转到另一个界面,能不能做一个简单的,在界面弹出一个框框登陆,我想了想做了这么一个案例,大家来看看成不成 贴上代码,实现了在同一个弹出窗上加载了登陆注册功能!可自由点击! ...
- CentOS7 mini安装后没有ifconfig命令的解决办法
在CentOS 最小化mini安装后,没有ifconfig命令,此时网卡也没有启动,所以无法yum安装net-tools. 下面三步解决此问题: 1 查看网卡名称 ip addr 2 启动网卡 ifu ...
- 浅谈Http协议是怎么回事?
老实说关于http协议这个概念,见到最多的还是各类招聘信息.在平时的工作中,除了了解一些请求,响应,请求头这些概念外,对于http协议也没有太多的关心.因为貌似对平时的工作没有什么影响,所以在写这篇关 ...
- (六)彻底理解synchronized
1.sychronized简介 在学习知识之前,我们先来看一个现象 public class SynchronizedDemo implements Runnable { private static ...
- Java JDBC的基础知识(三)
在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...
- centos 中设置网卡等相关参数
转:Centos启动和禁用网卡命令 ifup.ifdown:linux命令 实时地手动修改一些网络接口参数,可以利用ifconfig来实现,如果是要直接以配置文件,在 /etc/sysconfig/ ...
- Android - View的绘制你知道多少?
https://github.com/android-cn/android-open-project-analysis/tree/master/tech/viewdrawflow Android-La ...
- 封装7z软件实现批量文件或目录压缩
哈哈,作为一个特别懒的运维人来说 兄弟我写了一个批量压缩文件或目录的小工具,用来批量压缩文件目录 弄一下,然后就不用管他了,后天看结果就好了 操作步骤: 1.选择想做压缩处理的根目录 2.选择你要的功 ...
- php中parse_url函数解析
1.在php开发过程中我们经常要用到用户上传文件这个功能,那么用户上传文件我们肯定要知道用户上传文件的合法性,那么我们就要从url中获取文件的扩展名.那么就会用到parse_url()这个函数. pa ...
- CSS笔记——属性选择器
1.存在和值(Presence and value)属性选择器这些属性选择器尝试匹配精确的属性值:[attr]:该选择器选择包含 attr 属性的所有元素,不论 attr 的值为何.[attr=val ...