1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3. #面向对象(类+对象)
  4. 三大特性:封装、继承、多态
  5. 类的成员:
  6. 字段:
  7. 普通字段:保存在对象(实例)中,执行只能通过对象访问
  8. 静态字段:保存在类中,执行时可以通过对象访问,也可以通过类访问
  9. 方法:
  10. 普通方法:保存在类中,由对象调用
  11. 静态方法:@staticmethod,保存在类中,通过类可以直接调用,且不需要self参数
  12. 类方法:@classmethod,保存在类中,由类直接调用,需要一个cls参数,代指当前类
  13.  
  14. 类的创建和使用:
  15. class 类名:
  16. def 方法名(self,参数):
  17. print("hello")
  18.  
  19. 实例名=类名()
  20. 实例名.方法名(参数)
  21.  
  22. # 1.类的定义:
  23.  
  24. class Bar: #叫Bar的类
  25. def foo(self): #叫foo的方法
  26. print('hello')
  27.  
  28. # 2.类的执行
  29. obj = Bar() #创建实例(对象)--执行方法的中间人
  30. obj.foo() #
  31.  
  32. # 3.self参数
  33. 类在创建的过程中会在内存中开辟一个属于类的空间,当创建一个实例的时候也会创建属于实例的空间,
  34. 当实例需要执行类中的方法,回去找类空间相应的方法,方法中的self参数,接收的就是实例本身。
  35. 所以self代指调用方法的对象(实例)
  36. 1
  37. class Bar:
  38. def foo(self,arg):
  39. print(self,arg)
  40.  
  41. obj = Bar()
  42. print(obj)
  43. obj.foo('hello')
  44.  
  45. <__main__.Bar object at 0x000001D1995E4470>
  46. <__main__.Bar object at 0x000001D1995E4470> hello
  47. 2
  48. class Bar:
  49. def foo(self,arg):
  50. print(self,self.name,arg) #②self表示实例本身,self.name:从方法中读取实例中的元素,
  51.  
  52. obj = Bar()
  53. obj.name = "Tom" #①在实例的内存空间中添加新的元素
  54. obj.foo('hello')
  55.  
  56. <__main__.Bar object at 0x000001EB3F6645F8> Tom hello
  57.  
  58. # 4.构造方法
  59. obj = Bar() #作用:1.创建对象;2.通过对象执行类中的一个特殊方法
  60. 1
  61. class Bar:
  62. def __init__(self):
  63. """
  64. 构造方法
  65. """
  66. print('创建对象时自动执行构造方法')
  67.  
  68. obj = Bar()
  69. 2
  70. class Bar:
  71. def __init__(self,name,age):
  72. self.n = name
  73. self.a = age
  74. def foo(self):
  75. print(self.n,self.a)
  76.  
  77. obj = Bar("Tom",10)
  78. obj.foo()
  79.  
  80. # 5.类的三大特性之“继承”
  81. 5.1:父类与子类
  82. class Father: #父类(基类)
  83.  
  84. def __init__(self):
  85. pass
  86.  
  87. def bar(self):
  88. pass
  89.  
  90. class Son(Father): #子类(派生类)
  91.  
  92. def foo(self):
  93. pass
  94.  
  95. obj = Son()
  96. obj.bar()
  97. 5.2:类的重写
  98. class F:
  99. def f1(self):
  100. print('F.f1')
  101. def f2(self):
  102. print('F.f2')
  103.  
  104. class S(F):
  105. def s1(self):
  106. print('S.s1')
  107. def f2(self): #重写父类方法,其本质是在执行f2的方法时,在S类中已经找到,不会再向上(即父类)去找
  108. print('S.f2')
  109. obj = S()
  110. obj.f2()
  111. 5.3supper(子类名,self).父类方法
  112. 父类名.父类方法(self)
  113. class F:
  114. def f1(self):
  115. print('F.f1')
  116. def f2(self):
  117. print('F.f2')
  118.  
  119. class S(F):
  120. def s1(self):
  121. print('S.s1')
  122. def f2(self):
  123. super(S,self).f2() #先执行父类的方法,再执行自己的方法
  124. F.f2(self) # 另一种写法,推荐使用supper写法
  125. print('S.f2')
  126. obj = S()
  127. obj.f2()
  128.  
  129. 5.4:多继承
  130. ①左侧优先
  131. ②一条道做到黑
  132. ③有共同的父类,最后在父类中找
  133. 1
  134. class F:
  135. def bar(self):
  136. print('F.bar')
  137.  
  138. class F1(F):
  139. def boo(self):
  140. print('F1.bar')
  141.  
  142. class F2:
  143. def bar(self):
  144. print('F2.bar')
  145.  
  146. class S(F1,F2): #从下往上找
  147. pass
  148.  
  149. obj = S()
  150. obj.bar()
  151. ---------
  152. F.bar
  153. 2
  154. class F1:
  155. def bar(self):
  156. print('F1.bar')
  157.  
  158. class F2:
  159. def bar(self):
  160. print('F2.bar')
  161.  
  162. class S(F2,F1): #从左往右找
  163. pass
  164.  
  165. obj = S()
  166. obj.bar()
  167. ---------
  168. F2.bar
  169.  
  170. 3
  171. class Base:
  172. def bar(self):
  173. print('Base.bar')
  174.  
  175. class F(Base):
  176. def foo(self):
  177. print('F.bar')
  178.  
  179. class F1(F):
  180. def foo(self):
  181. print('F1.bar')
  182.  
  183. class F2(Base):
  184. def bar(self):
  185. print('F2.bar')
  186.  
  187. class S(F1,F2):
  188. pass
  189.  
  190. obj = S()
  191. obj.bar() #有共同的父类,最后在父类中找
  192. ---------
  193. F2.bar
  194.  
  195. # 6.类的三大特性之多态
  196. Python原生多态。
  197.  
  198. # 7.类的成员之字段
  199. class Bar:
  200. #静态字段:属于类,
  201. city = "Beijing"
  202. def __init__(self,name):
  203. #普通字段:属于对象,只能通过对象(实例)访问
  204. self.name = name
  205. #普通方法
  206. def foo(self):
  207. print(self.name)
  208.  
  209. obj = Bar('Tom')
  210. #通过对象访问普通字段
  211. print(obj.name)
  212. #直接通过类访问静态字段
  213. print(Bar.city)
  214.  
  215. -------
  216. Tom
  217. Beijing
  218.  
  219. # 8.类的成员之方法
  220. class Bar:
  221. # 普通方法
  222. def foo(self):
  223. print("Bar.foo")
  224. # 静态方法
  225. @staticmethod
  226. def show(): #
  227. print("Bar.show")
  228. # 静态方法
  229. @staticmethod
  230. def person(name,age):
  231. print(name,age)
  232. # 类方法
  233. @classmethod
  234. def classmd(cls): # cls是类名,
  235. print('Bar.classmd')
  236. print(cls)
  237. # 普通方法,通过对象调用
  238. obj = Bar()
  239. obj.foo()
  240. # 静态方法,通过类可以直接调用
  241. Bar.show()
  242. Bar.person('Tom',18)
  243. # 类方法,通过类可以直接调用
  244. Bar.classmd()
  245.  
  246. ---------
  247. Bar.show
  248. Tom 18
  249. Bar.classmd
  250. <class '__main__.Bar'>
  251.  
  252. # 应用场景:
  253. # 对象中需要保存一些值,执行某功能的时候需要使用对象中的值 --> 普通方法
  254. # 不需要对象中的值 --> 静态方法
  255.  
  256. # 9.类的成员之属性
  257. class Bar:
  258.  
  259. def __init__(self):
  260. pass
  261. # 属性
  262. @property
  263. def foo(self):
  264. return 1
  265.  
  266. @foo.setter
  267. def foo(self,val):
  268. print(val,"setter")
  269.  
  270. @foo.deleter
  271. def foo(self):
  272. print("delete")
  273.  
  274. obj = Bar()
  275. obj.foo=123 #执行赋值语句将执行@foo.setter下对应的方法
  276. del obj.foo #执行@foo.deleter下对应的方法
  277.  
  278. ----------
  279. 123 setter
  280. delete
  281. 1:
  282. class Page:
  283. def __init__(self,page):
  284. try:
  285. p = int(page)
  286. except Exception as e:
  287. p = 1
  288. self.page = p
  289. @property
  290. def start(self):
  291. val = (self.page-1) * 10
  292. return val
  293. @property
  294. def end(self):
  295. val = self.page * 10
  296. return val
  297.  
  298. li = []
  299. for i in range(1000):
  300. li.append(i)
  301. while True:
  302. p = input("请输入页码:")
  303. if p == "q":
  304. break
  305. obj = Page(p)
  306. print(li[obj.start:obj.end])
  307.  
  308. 2:属性的另一种表示方法
  309. class Bar:
  310.  
  311. def f1(self):
  312. return 1
  313. def f2(self,val):
  314. print('f2:',val)
  315. def f3(self):
  316. print("f3:del")
  317. per = property(fget=f1,fset=f2,fdel=f3,doc="注释")
  318.  
  319. obj = Bar()
  320. print(obj.per)
  321. obj.per = 123
  322. del obj.per
  323. ----------
  324. 1
  325. f2: 123
  326. f3:del
  327.  
  328. # 10.成员修饰符
  329.  
  330. ***子类在继承父类时,父类中的私有字段子类不能继承***
  331. 例:公有成员和私有成员
  332. #!/usr/bin/env python
  333. # -*- coding: utf-8 -*-
  334. class Bar:
  335. __city = "Beijing" #静态字段的私有化
  336. def __init__(self,name,age):
  337. self.name = name
  338. self.__age = age #私有字段,外部不能直接访问
  339. def foo(self): #方法可以访问私有字段,通过方法间接访问私有字段
  340. print(self.__age)
  341.  
  342. def __show(self): # 私有方法,外部不能直接访问
  343. return "hello world"
  344.  
  345. def func(self): #间接访问私有方法
  346. return self.__show()
  347.  
  348. obj = Bar('Tom',18)
  349. print(obj.name)
  350. obj.foo() # 通过方法间接访问私有字段
  351.  
  352. #间接访问私有方法
  353. r = obj.func()
  354. print (r)
  355.  
  356. # 11.特殊成员
  357. 11.1 __call__方法
  358. class Bar:
  359.  
  360. def __init__(self):
  361. print("init")
  362.  
  363. def __call__(self):
  364. print("call")
  365. obj = Bar()
  366. obj() #对象加括号自动执行__call__方法
  367.  
  368. 11.2 __str__ __int__
  369. class Bar:
  370.  
  371. def __init__(self):
  372. pass
  373. def __int__(self):
  374. return 111
  375. def __str__(self):
  376. return "str"
  377. obj = Bar()
  378. print(obj,type(obj))
  379. r = int(obj) #int 加对象,自动执行对象的int方法,并将返回值赋值给int对象
  380. print(r)
  381. r = str(obj)
  382. print(r) #str 加对象,自动执行对象的str方法,并将返回值赋值给str对象
  383. ------------
  384. str <class '__main__.Bar'>
  385. 111
  386. str
  387.  
  388. 11.3 例:__str_
  389. class Bar:
  390. def __init__(self,name,age):
  391. self.name = name
  392. self.age = age
  393. def __str__(self):
  394. return "%s:%s" %(self.name,self.age)
  395.  
  396. obj = Bar("Tom",18)
  397. print(obj)
  398. -----------
  399. Tom:18
  400. 11.4 __del__ 析构方法:对象销毁的时候执行
  401. class Bar:
  402.  
  403. def __init__(self):
  404. pass
  405. def __del__(self):
  406. print("析构方法")
  407. obj = Bar()
  408.  
  409. 11.5 __dict__ 将字段中的成员以字段的形式返回
  410. class Bar:
  411. """注释"""
  412. def __init__(self,name,age):
  413. self.name = name
  414. self.age = age
  415.  
  416. obj = Bar('Tom',18)
  417. #将字段中的成员以字段的形式返回
  418. print(Bar.__dict__)
  419. print(obj.__dict__)
  420. ---------
  421. {'__module__': '__main__', '__init__': <function Bar.__init__ at 0x0000013DAD733AE8>, '__weakref__': <attribute '__weakref__' of 'Bar' objects>, '__doc__': '注释', '__dict__': <attribute '__dict__' of 'Bar' objects>}
  422. {'name': 'Tom', 'age': 18}
  423. 11.6 __getitem__ __setitem__ __delitem__
  424. class Bar:
  425. """注释"""
  426. def __init__(self):
  427. pass
  428. def __getitem__(self,item):
  429. return item + 10
  430. def __setitem__(self,k,v):
  431. print(k,v)
  432. def __delitem__(self,val):
  433. print('delete:',val)
  434. obj = Bar()
  435. print(obj[2])
  436. obj['name']='Tom'
  437. del obj['del']
  438. ----------------
  439. 12
  440. name Tom
  441. delete: del
  442.  
  443. 11.7 __iter__
  444. 如果类中有__iter__方法,其对象就是一个可迭代对象;
  445. 对象名.__iter__()的返回值是迭代器
  446.  
  447. class Bar:
  448.  
  449. def __iter__(self):
  450. return iter([11,22,33])
  451.  
  452. obj = Bar()
  453. for i in obj:
  454. print(i)
  455. #for循环执行obj对象的类中的__iter__方法,并获取其迭代器;循环上一步中返回的对象
  456.  
  457. # 12.mateclass
  458.  
  459. # 13.反射
  460. #通过字符串操作对象中的成员
  461. class Bar:
  462. def __init__(self,name,age):
  463. self.name = name
  464. self.age = age
  465. def foo(self):
  466. print("hello world")
  467.  
  468. obj = Bar("Tom",18)
  469.  
  470. b = "name" #利用b取出obj中name的值
  471. # 方法1:
  472. print(obj.__dict__[b])
  473. # 方法2:
  474. # getattr() 去什么东西里面获取什么内容
  475. s = getattr(obj,b)
  476. print(s)
  477.  
  478. f = getattr(obj,'foo')
  479. print(f)
  480. f()
  481.  
  482. #getattr 判断是否有某个成员
  483. print(hasattr(obj,'foo'))
  484.  
  485. #setattr
  486. setattr(obj,'k1','v1') #新设置的值存在对象中
  487. print(obj.k1)
  488.  
  489. #delattr
  490. delattr(obj,'name')
  491. print(obj.name)
  492.  
  493. # 从类中取成员
  494. class Bar:
  495.  
  496. city = "Beijing"
  497.  
  498. def __init__(self,name,age):
  499. self.name = name
  500. self.age = age
  501. def foo(self):
  502. print("hello world")
  503.  
  504. print(getattr(Bar,'city'))
  505.  
  506. # 从模块中取成员
  507. import module
  508. getattr(module,'func')
  509. getattr(module,'Bar')
  510. # 例:反射的应用
  511. #!/usr/bin/env python
  512. # -*- coding: utf-8 -*-
  513. while True:
  514. inp = input("请输入要访问的URL:")
  515. if inp == "q":
  516. break
  517. class Bar:
  518.  
  519. def f1(self):
  520. return "首页"
  521.  
  522. def f2(self):
  523. return "新闻"
  524.  
  525. def f3(self):
  526. return "博客"
  527.  
  528. obj = Bar()
  529. if hasattr(obj,inp):
  530. f = getattr(obj,inp)
  531. print(f())
  532. else:
  533. print("")
  534.  
  535. # 14.单例模式
  536. 应用场景:数据库连接池
  537. 例:
  538. class Bar:
  539. __v = None
  540. @classmethod
  541. def get_instance(cls):
  542. if cls.__v:
  543. return cls.__v
  544. else:
  545. cls.__v = Bar()
  546. return cls.__v
  547. # 不用再使用Bar()创建实例
  548. obj1 = Bar.get_instance()
  549. print(obj1)
  550. obj2 = Bar.get_instance()
  551. print(obj2)
  552. obj3 = Bar.get_instance()
  553. print(obj3)
  554. ----------------
  555. <__main__.Bar object at 0x0000026D865B4A20>
  556. <__main__.Bar object at 0x0000026D865B4A20>
  557. <__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. 2018-8-10-win10-UWP-序列化

    title author date CreateTime categories win10 UWP 序列化 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 17 ...

  2. 初学Java 求最大公约数

    import java.util.Scanner; public class GreatesCommonDivisor { public static void main(String[] args) ...

  3. show all privileges from a user in oracle

    SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS; SELECT * ...

  4. python 中 len()和range()

    https://blog.csdn.net/qq_36357820/article/details/77850841

  5. html5 图片墙

    代码实例: <!DOCTYPE html> <html> <head> <style> body,html{ padding:0;margin:0;wi ...

  6. php 从7.0升级到7.2

    下面的方法安装的php是非线程安全的,apache2服务器用不了 1. 添加Ondřej Surý提供的PHP源: sudo apt-get install software-properties-c ...

  7. 通过注释查找mysql的表名

    通过注释查找mysql的表名 select * from INFORMATION_SCHEMA.columns where COLUMN_NAME Like '%placement%';

  8. 命令查看当前运行APP的包名和Activity

    先用usb链接手机 启动要查看的程序,命令查看当前运行的包名和Activity更清晰. 使用adb shell dumpsys window | findstr mCurrentFocus  命令查看 ...

  9. 新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!

    <阿里巴巴Java开发手册>是阿里内部Java工程师所遵循的开发规范,涵盖编程规约.单元测试规约.异常日志规约.MySQL规约.工程规约.安全规约等,这是近万名阿里Java技术精英的经验总 ...

  10. Codeforces 837D--Round Subset (DP)

    原题链接:http://codeforces.com/contest/837/problem/D 题意:在n个数字中,取k个数,使这些数的乘积后缀“0”的个数最大,输出后缀0的最大数量. 思路:显然只 ...