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进 ...
随机推荐
- linux性能分析工具Ntop
- rpmgraph - 显示 RPM 软件包依赖关系图
SYNOPSIS rpmgraph PACKAGE_FILE ... DESCRIPTION rpmgraph 使用 PACKAGE_FILE 参数来产生一个软件包依赖关系图.每个 PACKAGE_F ...
- ansible笔记(一)--架构图以及工作原理
一.ansible架构图 上图为ansible的基本架构,从上图可以了解到其由以下部分组成: 核心:ansible 核心模块(Core Modules):这些都是ansible自带的模块 扩展模块(C ...
- linux清除文件内容
#以下方式清空文件大小为0 cat /dev/null > catalina.out清除日志文件 $ : > filename $ > filename #以下方式清空文件大小为1 ...
- create-react-app按需引入antd-mobile
1.引入 react-app-rewired 并修改 package.json 里的启动配置: npm i react-app-rewired@2.0.2-next.0 // 需要安装低版本 否则np ...
- Android Studio使用tips
安装位置:C:\Users\xxx\AppData\Local\Android\sdk https://developer.android.com/topic/libraries/support-li ...
- HashMap的底层原理 cr:csdn:zhangshixi
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...
- angualr项目引入容联 七陌7mroo
最近项目要求在注册页面增加客服服务浮窗,各种查找资料准备采用7moor来实现.现记录一下实现过程,便于后期查看: 引入7moor浮窗有两种方式: 1.h5方式,这种情况一般是单独打开新页面即可: 直接 ...
- [CSP-S模拟测试]:树(树形DP+期望)
题目描述 梦游中的你来到了一棵$N$个节点的树上.你一共做了$Q$个梦,每个梦需要你从点$u$走到点$v$之后才能苏醒,由于你正在梦游,所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...
- JS 替换
JS 字符串有replace() 方法.但这个方法只会对匹配到的第一个字串替换. 如下例: var str = "wordwordwordword"; var strNew = s ...