Python3学习笔记——类
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#面向对象(类+对象)
三大特性:封装、继承、多态
类的成员:
字段:
普通字段:保存在对象(实例)中,执行只能通过对象访问
静态字段:保存在类中,执行时可以通过对象访问,也可以通过类访问
方法:
普通方法:保存在类中,由对象调用
静态方法:@staticmethod,保存在类中,通过类可以直接调用,且不需要self参数
类方法:@classmethod,保存在类中,由类直接调用,需要一个cls参数,代指当前类 类的创建和使用:
class 类名:
def 方法名(self,参数):
print("hello") 实例名=类名()
实例名.方法名(参数) # 1.类的定义: class Bar: #叫Bar的类
def foo(self): #叫foo的方法
print('hello') # 2.类的执行
obj = Bar() #创建实例(对象)--执行方法的中间人
obj.foo() # # 3.self参数
类在创建的过程中会在内存中开辟一个属于类的空间,当创建一个实例的时候也会创建属于实例的空间,
当实例需要执行类中的方法,回去找类空间相应的方法,方法中的self参数,接收的就是实例本身。
所以self代指调用方法的对象(实例)
例1:
class Bar:
def foo(self,arg):
print(self,arg) obj = Bar()
print(obj)
obj.foo('hello') <__main__.Bar object at 0x000001D1995E4470>
<__main__.Bar object at 0x000001D1995E4470> hello
例2:
class Bar:
def foo(self,arg):
print(self,self.name,arg) #②self表示实例本身,self.name:从方法中读取实例中的元素, obj = Bar()
obj.name = "Tom" #①在实例的内存空间中添加新的元素
obj.foo('hello') <__main__.Bar object at 0x000001EB3F6645F8> Tom hello # 4.构造方法
obj = Bar() #作用:1.创建对象;2.通过对象执行类中的一个特殊方法
例1:
class Bar:
def __init__(self):
"""
构造方法
"""
print('创建对象时自动执行构造方法') obj = Bar()
例2:
class Bar:
def __init__(self,name,age):
self.n = name
self.a = age
def foo(self):
print(self.n,self.a) obj = Bar("Tom",10)
obj.foo() # 5.类的三大特性之“继承”
5.1:父类与子类
class Father: #父类(基类) def __init__(self):
pass def bar(self):
pass class Son(Father): #子类(派生类) def foo(self):
pass obj = Son()
obj.bar()
5.2:类的重写
class F:
def f1(self):
print('F.f1')
def f2(self):
print('F.f2') class S(F):
def s1(self):
print('S.s1')
def f2(self): #重写父类方法,其本质是在执行f2的方法时,在S类中已经找到,不会再向上(即父类)去找
print('S.f2')
obj = S()
obj.f2()
5.3:supper(子类名,self).父类方法
父类名.父类方法(self)
class F:
def f1(self):
print('F.f1')
def f2(self):
print('F.f2') class S(F):
def s1(self):
print('S.s1')
def f2(self):
super(S,self).f2() #先执行父类的方法,再执行自己的方法
F.f2(self) # 另一种写法,推荐使用supper写法
print('S.f2')
obj = S()
obj.f2() 5.4:多继承
①左侧优先
②一条道做到黑
③有共同的父类,最后在父类中找
例1:
class F:
def bar(self):
print('F.bar') class F1(F):
def boo(self):
print('F1.bar') class F2:
def bar(self):
print('F2.bar') class S(F1,F2): #从下往上找
pass obj = S()
obj.bar()
---------
F.bar
例2:
class F1:
def bar(self):
print('F1.bar') class F2:
def bar(self):
print('F2.bar') class S(F2,F1): #从左往右找
pass obj = S()
obj.bar()
---------
F2.bar 例3:
class Base:
def bar(self):
print('Base.bar') class F(Base):
def foo(self):
print('F.bar') class F1(F):
def foo(self):
print('F1.bar') class F2(Base):
def bar(self):
print('F2.bar') class S(F1,F2):
pass obj = S()
obj.bar() #有共同的父类,最后在父类中找
---------
F2.bar # 6.类的三大特性之多态
Python原生多态。 # 7.类的成员之字段
class Bar:
#静态字段:属于类,
city = "Beijing"
def __init__(self,name):
#普通字段:属于对象,只能通过对象(实例)访问
self.name = name
#普通方法
def foo(self):
print(self.name) obj = Bar('Tom')
#通过对象访问普通字段
print(obj.name)
#直接通过类访问静态字段
print(Bar.city) -------
Tom
Beijing # 8.类的成员之方法
class Bar:
# 普通方法
def foo(self):
print("Bar.foo")
# 静态方法
@staticmethod
def show(): #
print("Bar.show")
# 静态方法
@staticmethod
def person(name,age):
print(name,age)
# 类方法
@classmethod
def classmd(cls): # cls是类名,
print('Bar.classmd')
print(cls)
# 普通方法,通过对象调用
obj = Bar()
obj.foo()
# 静态方法,通过类可以直接调用
Bar.show()
Bar.person('Tom',18)
# 类方法,通过类可以直接调用
Bar.classmd() ---------
Bar.show
Tom 18
Bar.classmd
<class '__main__.Bar'> # 应用场景:
# 对象中需要保存一些值,执行某功能的时候需要使用对象中的值 --> 普通方法
# 不需要对象中的值 --> 静态方法 # 9.类的成员之属性
class Bar: def __init__(self):
pass
# 属性
@property
def foo(self):
return 1 @foo.setter
def foo(self,val):
print(val,"setter") @foo.deleter
def foo(self):
print("delete") obj = Bar()
obj.foo=123 #执行赋值语句将执行@foo.setter下对应的方法
del obj.foo #执行@foo.deleter下对应的方法 ----------
123 setter
delete
例1:
class Page:
def __init__(self,page):
try:
p = int(page)
except Exception as e:
p = 1
self.page = p
@property
def start(self):
val = (self.page-1) * 10
return val
@property
def end(self):
val = self.page * 10
return val li = []
for i in range(1000):
li.append(i)
while True:
p = input("请输入页码:")
if p == "q":
break
obj = Page(p)
print(li[obj.start:obj.end]) 例2:属性的另一种表示方法
class Bar: def f1(self):
return 1
def f2(self,val):
print('f2:',val)
def f3(self):
print("f3:del")
per = property(fget=f1,fset=f2,fdel=f3,doc="注释") obj = Bar()
print(obj.per)
obj.per = 123
del obj.per
----------
1
f2: 123
f3:del # 10.成员修饰符 ***子类在继承父类时,父类中的私有字段子类不能继承***
例:公有成员和私有成员
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Bar:
__city = "Beijing" #静态字段的私有化
def __init__(self,name,age):
self.name = name
self.__age = age #私有字段,外部不能直接访问
def foo(self): #方法可以访问私有字段,通过方法间接访问私有字段
print(self.__age) def __show(self): # 私有方法,外部不能直接访问
return "hello world" def func(self): #间接访问私有方法
return self.__show() obj = Bar('Tom',18)
print(obj.name)
obj.foo() # 通过方法间接访问私有字段 #间接访问私有方法
r = obj.func()
print (r) # 11.特殊成员
11.1 __call__方法
class Bar: def __init__(self):
print("init") def __call__(self):
print("call")
obj = Bar()
obj() #对象加括号自动执行__call__方法 11.2 __str__ 与 __int__
class Bar: def __init__(self):
pass
def __int__(self):
return 111
def __str__(self):
return "str"
obj = Bar()
print(obj,type(obj))
r = int(obj) #int 加对象,自动执行对象的int方法,并将返回值赋值给int对象
print(r)
r = str(obj)
print(r) #str 加对象,自动执行对象的str方法,并将返回值赋值给str对象
------------
str <class '__main__.Bar'>
111
str 11.3 例:__str_
class Bar:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return "%s:%s" %(self.name,self.age) obj = Bar("Tom",18)
print(obj)
-----------
Tom:18
11.4 __del__ 析构方法:对象销毁的时候执行
class Bar: def __init__(self):
pass
def __del__(self):
print("析构方法")
obj = Bar() 11.5 __dict__ 将字段中的成员以字段的形式返回
class Bar:
"""注释"""
def __init__(self,name,age):
self.name = name
self.age = age obj = Bar('Tom',18)
#将字段中的成员以字段的形式返回
print(Bar.__dict__)
print(obj.__dict__)
---------
{'__module__': '__main__', '__init__': <function Bar.__init__ at 0x0000013DAD733AE8>, '__weakref__': <attribute '__weakref__' of 'Bar' objects>, '__doc__': '注释', '__dict__': <attribute '__dict__' of 'Bar' objects>}
{'name': 'Tom', 'age': 18}
11.6 __getitem__ 、 __setitem__ 和 __delitem__
class Bar:
"""注释"""
def __init__(self):
pass
def __getitem__(self,item):
return item + 10
def __setitem__(self,k,v):
print(k,v)
def __delitem__(self,val):
print('delete:',val)
obj = Bar()
print(obj[2])
obj['name']='Tom'
del obj['del']
----------------
12
name Tom
delete: del 11.7 __iter__
如果类中有__iter__方法,其对象就是一个可迭代对象;
对象名.__iter__()的返回值是迭代器 class Bar: def __iter__(self):
return iter([11,22,33]) obj = Bar()
for i in obj:
print(i)
#for循环执行obj对象的类中的__iter__方法,并获取其迭代器;循环上一步中返回的对象 # 12.mateclass # 13.反射
#通过字符串操作对象中的成员
class Bar:
def __init__(self,name,age):
self.name = name
self.age = age
def foo(self):
print("hello world") obj = Bar("Tom",18) b = "name" #利用b取出obj中name的值
# 方法1:
print(obj.__dict__[b])
# 方法2:
# getattr() 去什么东西里面获取什么内容
s = getattr(obj,b)
print(s) f = getattr(obj,'foo')
print(f)
f() #getattr 判断是否有某个成员
print(hasattr(obj,'foo')) #setattr
setattr(obj,'k1','v1') #新设置的值存在对象中
print(obj.k1) #delattr
delattr(obj,'name')
print(obj.name) # 从类中取成员
class Bar: city = "Beijing" def __init__(self,name,age):
self.name = name
self.age = age
def foo(self):
print("hello world") print(getattr(Bar,'city')) # 从模块中取成员
import module
getattr(module,'func')
getattr(module,'Bar')
# 例:反射的应用
#!/usr/bin/env python
# -*- coding: utf-8 -*-
while True:
inp = input("请输入要访问的URL:")
if inp == "q":
break
class Bar: def f1(self):
return "首页" def f2(self):
return "新闻" def f3(self):
return "博客" obj = Bar()
if hasattr(obj,inp):
f = getattr(obj,inp)
print(f())
else:
print("") # 14.单例模式
应用场景:数据库连接池
例:
class Bar:
__v = None
@classmethod
def get_instance(cls):
if cls.__v:
return cls.__v
else:
cls.__v = Bar()
return cls.__v
# 不用再使用Bar()创建实例
obj1 = Bar.get_instance()
print(obj1)
obj2 = Bar.get_instance()
print(obj2)
obj3 = Bar.get_instance()
print(obj3)
----------------
<__main__.Bar object at 0x0000026D865B4A20>
<__main__.Bar object at 0x0000026D865B4A20>
<__main__.Bar object at 0x0000026D865B4A20>
Python3学习笔记——类的更多相关文章
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- Python3学习笔记 - 准备环境
前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...
- python3学习笔记(7)_listComprehensions-列表生成式
#python3 学习笔记17/07/11 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #通过列表生成式可以生成格式各样的list,这种list 一 ...
- python3学习笔记(6)_iteration
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #类似 其他语言的for循环,但是比for抽象程度更高 # f ...
- python3学习笔记(5)_slice
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #切片slice 大大简化 对于指定索引的操作 fruits ...
- 《python基础教程(第二版)》学习笔记 类和对象(第7章)
<python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person: def setName(self,name): self.name=n ...
- Python3学习笔记01-环境安装和运行环境
最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...
- python3学习笔记(9)_closure
#python 学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #从高阶函数的定义,我们可以知道,把函数作为参数的函数, ...
- python3学习笔记(8)_sorted
# python学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #python 内置sorted()函数 可以对list进 ...
随机推荐
- 【记录】eclipse jar包看不了源码
第一步:下载JAD . jad官方地址的官方下载地址是: http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasem ...
- Nginx学习总结:常用module(二)
斜体下划线,表示建议采用默认配置,无需显式的配置 一.ngx_core_module 1.accept_mutex [on | off] 上下文:events 默认为“on”,在wor ...
- day04 列表增删改查、元祖以及range
01 课前小甜点 千万不要随意做决定 只要你做了决定,你要坚持下去. 02 昨日内容回顾 int <---> bool : 非0 True 0 False True 1 False 0 i ...
- JVM内存组成
JVM的内存区域模型 1.方法区 也称永久代.非堆. 用于存储虚拟机加载的类信息.常量.静态变量,是各个线程共享的内存区域. 默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize和 ...
- MySQL入门常用命令
使用本地 MySQL,系统 Ubuntu. mysql -u root -p 输入 root 用户的密码进入MySQL: mysql>
- 【Eureka】实现原理
Eureka Client 拉取Eureka Server中的全量注册表 注册自身实例InstanceInfo至Eureka Server 初始化定时任务 心跳(续约)任务 拉取增量注册表更新本地注册 ...
- php max()函数 语法
php max()函数 语法 作用:从所有参数中找到最大数 语法:max(X,Y,Z) 或者max(array(X,Y,Z)) 参数:max函数中参数至少一个,可以多个参数,也可以是数组. 说明:如果 ...
- STM32输入捕获TIM2四通道
相比于一通道,原子的例程里因为清了计数时间,所以要对程序进行修改. 记录上升沿后的计数,然后记录下降沿的计数.相减后计算高电平时间,对于定时器中断间隔的边界要分开处理. 这里因为我的接收机时间是1ms ...
- BZOJ 2694: Lcm 莫比乌斯反演 + 积性函数 + 线性筛 + 卡常
求 $\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)\mu(gcd(i,j))^2$ $\Rightarrow \sum_{d=1}^{n}\mu(d)^2\sum_{i ...
- MacOS Catalina 导致bash命令失效的一些总结
欢天喜地的升级了最新的OS后,第一个发现bash失效的是使用pod命令出现: -bash: pod: command not found 这个不会导致cocoapods无法正常使用,可以使用绝对路径里 ...