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进 ...
随机推荐
- 2018-8-10-win10-UWP-序列化
title author date CreateTime categories win10 UWP 序列化 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 17 ...
- 初学Java 求最大公约数
import java.util.Scanner; public class GreatesCommonDivisor { public static void main(String[] args) ...
- show all privileges from a user in oracle
SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS; SELECT * ...
- python 中 len()和range()
https://blog.csdn.net/qq_36357820/article/details/77850841
- html5 图片墙
代码实例: <!DOCTYPE html> <html> <head> <style> body,html{ padding:0;margin:0;wi ...
- php 从7.0升级到7.2
下面的方法安装的php是非线程安全的,apache2服务器用不了 1. 添加Ondřej Surý提供的PHP源: sudo apt-get install software-properties-c ...
- 通过注释查找mysql的表名
通过注释查找mysql的表名 select * from INFORMATION_SCHEMA.columns where COLUMN_NAME Like '%placement%';
- 命令查看当前运行APP的包名和Activity
先用usb链接手机 启动要查看的程序,命令查看当前运行的包名和Activity更清晰. 使用adb shell dumpsys window | findstr mCurrentFocus 命令查看 ...
- 新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!
<阿里巴巴Java开发手册>是阿里内部Java工程师所遵循的开发规范,涵盖编程规约.单元测试规约.异常日志规约.MySQL规约.工程规约.安全规约等,这是近万名阿里Java技术精英的经验总 ...
- Codeforces 837D--Round Subset (DP)
原题链接:http://codeforces.com/contest/837/problem/D 题意:在n个数字中,取k个数,使这些数的乘积后缀“0”的个数最大,输出后缀0的最大数量. 思路:显然只 ...