#!/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学习笔记——类的更多相关文章

  1. Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

    Python3学习笔记(urllib模块的使用)   1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,  ...

  2. Python3学习笔记 - 准备环境

    前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...

  3. python3学习笔记(7)_listComprehensions-列表生成式

    #python3 学习笔记17/07/11 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #通过列表生成式可以生成格式各样的list,这种list 一 ...

  4. python3学习笔记(6)_iteration

    #python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #类似 其他语言的for循环,但是比for抽象程度更高 # f ...

  5. python3学习笔记(5)_slice

    #python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #切片slice 大大简化 对于指定索引的操作 fruits ...

  6. 《python基础教程(第二版)》学习笔记 类和对象(第7章)

    <python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person:    def setName(self,name):        self.name=n ...

  7. Python3学习笔记01-环境安装和运行环境

    最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...

  8. python3学习笔记(9)_closure

    #python 学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #从高阶函数的定义,我们可以知道,把函数作为参数的函数, ...

  9. python3学习笔记(8)_sorted

    # python学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #python 内置sorted()函数 可以对list进 ...

随机推荐

  1. elasticsearch 基础 —— Update API

    Update API 更新API允许基于提供的脚本更新文档.该操作从索引获取文档(与分片并置),运行脚本(使用可选的脚本语言和参数),并对结果进行索引(也允许删除或忽略操作).它使用版本控制来确保在& ...

  2. 13-H.264编码解码器的无线应用:1080P60 3D无线影音传输器

    H.264编码解码器的无线应用:1080P60 3D无线影音传输器 一.应用领域 家庭媒体娱乐中心 新闻现场采访 无线3D投影机 高清视频会议终端无线延长器 教学,医疗示教 考古,高档商业区域,监狱等 ...

  3. Git --05 Gitlab使用

    目录 Gitlab使用 01. 外观配置 02. Gitlab汉化配置 03. 注册限制 04. 创建用户及组 05. 创建用户 06. 把用户添加到组 07. 创建项目 08. 推送代码到Gitla ...

  4. 关于springmvc 整合jackson报错问题

    spring mvc 在整合jackson中报错如下 Context initialization failed org.springframework.beans.factory.BeanCreat ...

  5. Nginx配置参数详解参考示例

    user nobody; worker_processes 2; events{ worker_connections 1024; } http{ #设置默认类型为二进制流 default_type ...

  6. Linux网络栈

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11394930.html OSI模型 OSI 模型把网络互联的框架分为应用层.表示层.会话层.传输层.网 ...

  7. 【leetcode】1020. Partition Array Into Three Parts With Equal Sum

    题目如下: Given an array A of integers, return true if and only if we can partition the array into three ...

  8. 【leetcode】1007. Minimum Domino Rotations For Equal Row

    题目如下: In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino.  ( ...

  9. Spring Security 安全认证

    Spring Boot 使用 Mybatis 依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> ...

  10. LYOI2016 Summer 一次函数 (线段树)

    题目描述 fqk 退役后开始补习文化课啦,于是他打开了数学必修一开始复习函数,他回想起了一次函数都是 f(x)=kx+b的形式,现在他给了你n个一次函数 fi(x)=kix+b,然后将给你m个操作,操 ...