面向对象

语言的分类

Python的类

定义

  1. class ClassName:
  2. pass

  1. class MyCalss:
  2. """A example class"""#文档字符串
  3. x = 'abc'#类属性
  4.  
  5. def foo(self):#类属性foo,也是方法
  6. return 'myclass'

类对象及类属性

实例化

  1. a = MyClass() #实例化

__init__方法

  1. class MyCalss:
  2.  
  3. def __init__(self):#初始化
  4. print('init')
  5.  
  6. a = MyCalss()

实例对象

self

  1. class Person:
  2. def __init__(self):
  3. print(id(self))
  4.  
  5. c = Person() #会调用__init__
  6. print('p={}'.format(id(c)))
  7. #输出结果:
  8. 43079160
  9. c=43079160

实例变量和类变量

  1. class Person:
  2. age = 7
  3. height = 175
  4. def __init__(self,name,age=23):
  5. self.name = name
  6. self.age = age
  7.  
  8. tom = Person('tom')
  9. jerry = Person('jerry',20)
  10.  
  11. Person.age = 30
  12. print(Person.age,tom.age,jerry.age)
  13. print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n')
  14.  
  15. Person.height += 5
  16. print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n')
  17.  
  18. tom.height = 176
  19. print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n')
  20.  
  21. Person.weight = 65
  22. print(Person.__dict__['weight'])
  23. print(tom.__dict__['weight'])#KeyError

装饰一个类

  1. #增加类变量
  2. def add_name(name,cls):
  3. cls.NAME = name #动态增加类属性
  4.  
  5. #改进成装饰器(带参)
  6. def add_name1(name):
  7. def wrapper(cls):
  8. cls.NAME = name
  9. return cls
  10. return wrapper
  11.  
  12. @add_name1('tom')
  13. class Person:
  14. AGE = 1
  15.  
  16. print(Person.NAME)

类方法和静态方法

普通函数

类方法

  

静态方法

方法的调用

  1. class Person:
  2. def normal_method():
  3. print('nomal')
  4.  
  5. def method(self):
  6. print("{}'s method ".format(self))
  7.  
  8. @classmethod
  9. def class_method(cls):
  10. print('class = {0.__name__} {0}'.format(cls))
  11. cls.HEIGHT =175
  12.  
  13. @staticmethod
  14. def static_method():
  15. print(Person.HEIGHT)
  16.  
  17. #~~~类访问~~~
  18. print(1,Person.normal_method())
  19. # print(2,Person.method())#报错
  20. print(3,Person.class_method())
  21. print(4,Person.static_method())
  22. #~~~实例访问~~~
  23. tom = Person()
  24. # print(5,tom.normal_method())#报错
  25. print(6,tom.method())
  26. print(7,tom.class_method())
  27. print(8,tom.static_method())

访问控制

私有属性Private

  1. 一般来说,可以在内部自定义一个方法来访问私有变量。

私有变量的本质

保护变量

 私有方法

私有方法的本质

私有成员的总结

补丁

  1. #test1.py
  2. from test2 import Person
  3. from test3 import get_score
  4.  
  5. def monkeypatch4Person():
  6. Person.get_score = get_score
  7.  
  8. print(Person().get_score())
  9. monkeypatch4Person()
  10.  
  11. print(Person().get_score())
  12.  
  13. #输出如下:
  14. {'English': 78, 'Chinese': 86, 'History': 82} #打补丁前
  15. {'name': 'Person', 'English': 88, 'Chinese': 90, 'History': 85} #打补丁后
  1. #test2.py
  2. class Person:
  3. def get_score(self):
  4. ret = {'English':78,'Chinese':86,'History':82}
  5. return ret
  1. #test3.py
  2. def get_score(self):
  3. return dict(name=self.__class__.__name__,English=88,Chinese=90,History=85)

属性装饰器

  1. class Person:
  2. def __init__(self,chinese,english,history):
  3. self._chinese = chinese
  4. self._eng = english
  5. self.__his = history
  6.  
  7. def gethis(self):
  8. return self.__his
  9.  
  10. def sethis(self,value):
  11. self.__his = value
  12.  
  13. def seteng(self,value):
  14. self._eng = value
  15.  
  16. @property
  17. def chinese(self):
  18. return self._chinese
  19.  
  20. @chinese.setter
  21. def chinese(self,value):
  22. self._chinese = value
  23.  
  24. @chinese.deleter
  25. def chinese(self):
  26. # del self._chinese
  27. print('del self._chinese')
  28.  
  29. #x = property(getx, setx, delx, "I'm the 'x' property.")
  30. eng = property(lambda self:self._eng,seteng)
  31.  
  32. student = Person(80,90,88)
  33. print(student.chinese)#
  34. student.chinese = 100
  35. print(student.chinese)#
  36. del student.chinese
  37. print(student.eng)#
  38. student.eng =110
  39. print(student.eng)#

对象的销毁

方法重载(overload)

  1. 重写也就是覆盖的意思,即override

封装

练习

  1. #1.其结构值得参考!
  2. from random import randint
  3. class RandomGenerator:
  4. def __init__(self,count=10,start=1,stop=100):
  5. self.count = count
  6. self.start = start
  7. self.stop = stop
  8. self.gen = self._generatr()
  9.  
  10. def _generatr(self):
  11. while True:
  12. yield [randint(self.start,self.stop) for _ in range(self.count)]
  13.  
  14. def gengerate(self,count):
  15. self.count = count
  16. return next(self.gen)
  17.  
  18. rg = RandomGenerator()
  19. lst = rg.gengerate(10)
  20. print(lst)
  1. #
  2. class Point:
  3. def __init__(self,x,y):
  4. self.x = x
  5. self.y = y
  6.  
  7. def __repr__(self):
  8. return '{}:{}'.format(self.x,self.y)
  9. lst1 = [Point(*v) for v in zip(rg.gengerate(10),rg.gengerate(10))]
  10. print(lst1)
  11. #输出如下:
  12. [36:14, 84:20, 31:84, 68:82, 36:48, 87:67, 64:49, 8:15, 55:73, 90:75]
  1. #
  2. class Car:
  3. def __init__(self,mark=None,color=None,price=None,speed=None):
  4. self._mark = mark
  5. self._color = color
  6. self._price = price
  7. self._speed = speed
  8.  
  9. class CarInfo:
  10. def __init__(self):
  11. self.lst = []
  12.  
  13. def addcar(self,car:Car):
  14. self.lst.append(car)
  15.  
  16. def showcarinfo(self):
  17. return self.lst
  1. #
  2. class Temperature:
  3. def __init__(self,t,unit='c'):
  4. self._c = None
  5. self._f = None
  6. self._k = None
  7. if unit == 'k':
  8. self._c = self.k2c(t)
  9. self._k = t
  10. elif unit == 'f':
  11. self._c = self.f2c(t)
  12. self._f = t
  13. else:
  14. self._c = t
  15.  
  16. @property
  17. def k(self):
  18. if self._k is None:
  19. self._k = self.c2k(self._c)
  20. return self._k
  21.  
  22. @property
  23. def f(self):
  24. if self._f is None:
  25. self._f = self.c2f(self._c)
  26. return self._f
  27.  
  28. @property
  29. def c(self):
  30. return self._c
  31.  
  32. @classmethod
  33. def c2f(cls,c):
  34. return c*9/5+32
  35.  
  36. @classmethod
  37. def f2c(cls,f):
  38. return (f-32)*5/9
  39.  
  40. @classmethod
  41. def c2k(cls,c):
  42. return c+273.15
  43.  
  44. @classmethod
  45. def k2c(cls,k):
  46. return k-273.15
  47.  
  48. @classmethod
  49. def f2k(cls,f):
  50. return cls.c2k(cls.f2c(f))
  51.  
  52. @classmethod
  53. def k2f(cls,k):
  54. return cls.c2f(cls.k2c(k))
  55.  
  56. print(Temperature.c2f(40))
  57. print(Temperature.c2k(40))
  58. print(Temperature.f2c(104.0))
  59. print(Temperature.f2k(104.0))
  60. print(Temperature.k2c(313.5))
  61. print(Temperature.k2f(313.5))
  62.  
  63. t = Temperature(40)
  64. print(t.c,t.f,t.k)
  65.  
  66. t = Temperature(313.5,'k')
  67. print(t.c,t.f,t.k)
  1. #简单购物车
  2. class Color:
  3. RED = 0
  4. BLUE = 1
  5. GREEN = 2
  6. BLACK = 3
  7. GOLDEN = 4
  8. OTHER = 100
  9.  
  10. class Item:
  11. def __init__(self,**kwargs):
  12. self.__info = kwargs
  13.  
  14. def __repr__(self):
  15. return str(sorted(self.__info.items()))
  16.  
  17. class Cart:
  18. def __init__(self):
  19. self.items = []
  20.  
  21. def additem(self,item:Item):
  22. self.items.append(item)
  23.  
  24. def gatallitems(self):
  25. return self.items
  26.  
  27. mycart = Cart()
  28. myphone = Item(mark='Iponhe',color=Color.GOLDEN,memory='64G')
  29. mycart.additem(myphone)
  30. mycar = Item(mark='BMW',color=Color.BLACK,memory='220/s')
  31. mycart.additem(mycar)
  32. print(mycart.gatallitems())

Python进阶8---面向对象基础1的更多相关文章

  1. Python进阶(十三)----面向对象

    Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: ​ 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...

  2. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  3. python进阶08 MySQL基础补充

    python进阶08 MySQL基础补充 本次课程都是基于三张表格的使用 一.子查询 #如何找到‘张三’的成绩 #思路:先找到张三的学号,在拿这个张三的学号到成绩表里面去匹配,得出成绩 #如何用一条查 ...

  4. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  5. Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)

    day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库:    简称:DataBase ---->DB    数据库即存放数据的仓库, ...

  6. Python进阶之面向对象编程

    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  7. python之路 面向对象基础 XML

    一.面向对象基础 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  8. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

  9. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  10. Python进阶之面向对象编程概述

    Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

随机推荐

  1. Python Ast介绍及应用

    Abstract Syntax Trees即抽象语法树.Ast是python源码到字节码的一种中间产物,借助ast模块可以从语法树的角度分析源码结构.此外,我们不仅可以修改和执行语法树,还可以将Sou ...

  2. 关于获取资源文件,Class.getResource和ClassLoader.getResource的区别

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-02-22/29.html 作者:夜月归途 出处:http://www.guitu ...

  3. GoLang simple-project-demo-02

    GoLang 有很多种数据类型:字符型,整型,浮点型,布尔型.下面是基础例子: package main import "fmt" func main() { fmt.Printl ...

  4. [orleans2.1]这是你没玩过的船新版本

    不知不觉orleans就发布到2.1版本的,但是说也奇怪orleans越是完善我发现园子相关的博客就越少,大概是大佬都在美滋滋用在生产环境,不屑于玩demo了吧. 但是小弟不才还是只会玩demo,所以 ...

  5. 初学pyhon的几个练习小程序

    一.概述 此程序示例为博主根据路飞学城的python的作业而写的(博主也是python初学者,仅花了99元报了路飞学城的python入门14天集中营3期网络课堂班),此程序非常适合python初学者拿 ...

  6. PostGIS计算矢量切片(二)--按值渲染

    方案背景     今年三月份写了一篇postgis计算矢量切片,参考了网上资料给出了一份很粗糙的相关方案(文章写的更粗糙).当时的方案中只能针对gis形状进行渲染,而不能用属性渲染.针对这个情况,本文 ...

  7. Odoo的模块和应用程序的区别和使用

    一.模块(modules)和应用程序(application)的区别: 模块元件是Odoo应用程序的组成快.模块可以将新功能添加到Odoo,或改变现有功能.模块是一个包含名为__manifest__. ...

  8. solr8.0 ik中文分词器的简单配置(二)

    下载ik分词器,由于是solr8.0,一些ik分词器版本可能不兼容,以下是个人亲测可行的版本 ik分词器下载 然后将解压出来的两个jar包放到以下路径: 其它的三个文件放到以下路径: 如果没有clas ...

  9. Openlayers系列(一)关于地图投影相关错误的解决方案

    背景 近期开发以MongoDB为基础的分布式地理数据管理平台系统,被要求做一个简单的demo给客户进行演示.于是笔者便打算向数据库中存储一部分瓦片数据,写一个简单的存取服务器,使用Openlayers ...

  10. Android远程桌面助手(B1185)for Android P开发者预览版

    Android P的开发者预览版已出,其中App compatibility changes部分特别强调“The platform restricts the use of some non-SDK ...