面向对象

语言的分类

Python的类

定义

class ClassName:pass

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

类对象及类属性

实例化

a = MyClass()   #实例化

__init__方法

class MyCalss:def __init__(self):#初始化print('init')a  = MyCalss()

实例对象

self

class Person:def __init__(self):print(id(self))c = Person()    #会调用__init__
print('p={}'.format(id(c)))
#输出结果:
43079160
c=43079160

实例变量和类变量

class Person:age = 7height = 175def __init__(self,name,age=23):self.name = nameself.age = agetom  = Person('tom')
jerry = Person('jerry',20)Person.age = 30
print(Person.age,tom.age,jerry.age)
print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n')Person.height += 5
print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n')tom.height = 176
print(Person.__dict__,tom.__dict__,jerry.__dict__,sep='\n')Person.weight = 65
print(Person.__dict__['weight'])
print(tom.__dict__['weight'])#KeyError

装饰一个类

#增加类变量
def add_name(name,cls):cls.NAME = name #动态增加类属性#改进成装饰器(带参)
def add_name1(name):def wrapper(cls):cls.NAME = namereturn clsreturn wrapper@add_name1('tom')
class Person:AGE = 1print(Person.NAME)

类方法和静态方法

普通函数

类方法

  

静态方法

方法的调用

class Person:def normal_method():print('nomal')def method(self):print("{}'s method ".format(self))@classmethoddef class_method(cls):print('class = {0.__name__}  {0}'.format(cls))cls.HEIGHT  =175@staticmethoddef static_method():print(Person.HEIGHT)#~~~类访问~~~
print(1,Person.normal_method())
# print(2,Person.method())#报错
print(3,Person.class_method())
print(4,Person.static_method())
#~~~实例访问~~~
tom = Person()
# print(5,tom.normal_method())#报错
print(6,tom.method())
print(7,tom.class_method())
print(8,tom.static_method())

访问控制

私有属性Private

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

私有变量的本质

保护变量

 私有方法

私有方法的本质

私有成员的总结

补丁

#test1.py
from test2 import Person
from test3 import get_scoredef monkeypatch4Person():Person.get_score = get_scoreprint(Person().get_score())
monkeypatch4Person()print(Person().get_score())#输出如下:
{'English': 78, 'Chinese': 86, 'History': 82}    #打补丁前
{'name': 'Person', 'English': 88, 'Chinese': 90, 'History': 85}    #打补丁后

#test2.py
class Person:def get_score(self):ret = {'English':78,'Chinese':86,'History':82}return ret

#test3.py
def get_score(self):return dict(name=self.__class__.__name__,English=88,Chinese=90,History=85)

属性装饰器

class Person:def __init__(self,chinese,english,history):self._chinese = chineseself._eng = englishself.__his = historydef gethis(self):return self.__hisdef sethis(self,value):self.__his = valuedef seteng(self,value):self._eng = value@propertydef chinese(self):return self._chinese@chinese.setterdef chinese(self,value):self._chinese = value@chinese.deleterdef chinese(self):# del self._chineseprint('del self._chinese')#x = property(getx, setx, delx, "I'm the 'x' property.")eng = property(lambda self:self._eng,seteng)student = Person(80,90,88)
print(student.chinese)#80
student.chinese = 100
print(student.chinese)#100
del student.chinese
print(student.eng)#90
student.eng =110
print(student.eng)#110

对象的销毁

方法重载(overload)

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

封装

练习

#1.其结构值得参考!
from random import randint
class RandomGenerator:def __init__(self,count=10,start=1,stop=100):self.count = countself.start = startself.stop = stopself.gen = self._generatr()def _generatr(self):while True:yield [randint(self.start,self.stop) for _ in range(self.count)]def gengerate(self,count):self.count = countreturn next(self.gen)rg = RandomGenerator()
lst = rg.gengerate(10)
print(lst)

#2
class Point:def __init__(self,x,y):self.x = xself.y = ydef __repr__(self):return  '{}:{}'.format(self.x,self.y)
lst1 = [Point(*v) for v in zip(rg.gengerate(10),rg.gengerate(10))]
print(lst1)
#输出如下:
[36:14, 84:20, 31:84, 68:82, 36:48, 87:67, 64:49, 8:15, 55:73, 90:75]

#3
class Car:def __init__(self,mark=None,color=None,price=None,speed=None):self._mark = markself._color = colorself._price = priceself._speed = speedclass CarInfo:def __init__(self):self.lst = []def addcar(self,car:Car):self.lst.append(car)def showcarinfo(self):return self.lst

#4
class Temperature:def __init__(self,t,unit='c'):self._c = Noneself._f = Noneself._k = Noneif unit == 'k':self._c = self.k2c(t)self._k = telif unit == 'f':self._c = self.f2c(t)self._f = telse:self._c = t@propertydef k(self):if self._k is None:self._k = self.c2k(self._c)return self._k@propertydef f(self):if self._f is None:self._f = self.c2f(self._c)return self._f@propertydef c(self):return self._c@classmethoddef c2f(cls,c):return c*9/5+32@classmethoddef f2c(cls,f):return (f-32)*5/9@classmethoddef c2k(cls,c):return c+273.15@classmethoddef k2c(cls,k):return k-273.15@classmethoddef f2k(cls,f):return cls.c2k(cls.f2c(f))@classmethoddef k2f(cls,k):return cls.c2f(cls.k2c(k))print(Temperature.c2f(40))
print(Temperature.c2k(40))
print(Temperature.f2c(104.0))
print(Temperature.f2k(104.0))
print(Temperature.k2c(313.5))
print(Temperature.k2f(313.5))t = Temperature(40)
print(t.c,t.f,t.k)t = Temperature(313.5,'k')
print(t.c,t.f,t.k)

#简单购物车
class Color:RED = 0BLUE = 1GREEN = 2BLACK = 3GOLDEN = 4OTHER = 100class Item:def __init__(self,**kwargs):self.__info = kwargsdef __repr__(self):return str(sorted(self.__info.items()))class Cart:def __init__(self):self.items = []def additem(self,item:Item):self.items.append(item)def gatallitems(self):return self.itemsmycart = Cart()
myphone = Item(mark='Iponhe',color=Color.GOLDEN,memory='64G')
mycart.additem(myphone)
mycar = Item(mark='BMW',color=Color.BLACK,memory='220/s')
mycart.additem(mycar)
print(mycart.gatallitems())

转载于:https://www.cnblogs.com/xiaoshayu520ly/p/10715456.html

Python进阶8---面向对象基础1相关推荐

  1. python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)

    回顾 在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用.今天我们继续讲一下Python中面向对象的相关知识点 ...

  2. python进阶《面向对象编程》类和对象

    目录 零.前言 一.面向对象编程 (一)概念理解 二.类和对象的概念 (一)面向对象的两个重要概念类和对象. (二)类的解释   1.创建类   2.类属性(区别于下面的对象属性) (三)对象的解释 ...

  3. Python OOP:面向对象基础,定义类,创建对象/实例,self,创建多个对象,添加对象属性,访问对象属性,__init__方法,带参数的__init__,__str__方法,__del__方法

    一.理解面向对象 面向对象是⼀种抽象化的编程思想,很多编程语⾔中都有的⼀种思想. ⾯向对象就是将编程当成是⼀个事物,对外界来说,事物是直接使用的,不用去管他内部的情况.⽽编程就是设置事物能够做什么事. ...

  4. Python进阶--网络爬虫基础

    Python网络爬虫基础 一.网络请求 ProxyHandler处理器(代理): request库 发送get请求: 发送post请求: 使用代理 requests 处理cookie 信息.处理不信任 ...

  5. Python 进阶_OOP 面向对象编程_组合与继承

    #目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...

  6. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  7. Python学习:面向对象基础练习——士兵突击(代码演示) 及 身份运算符

    1.面向对象封装案例II--士兵突击 目标 士兵突击案例 身份运算符 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 -- 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 ...

  8. 个人python学习-Day7面向对象基础(上)

    一.面向对象介绍 1.概述 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:将数据与函数绑定到一起,进行封装,这样能够更快速的 ...

  9. Python 进阶_OOP 面向对象编程_self 的实例绑定

    目录 目录 self 和绑定 调用非绑定的方法 self 和绑定 在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时 ...

  10. Python 进阶_OOP 面向对象编程_类属性和方法

    目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象 ...

最新文章

  1. 【HDU】4509 湫湫系列故事——减肥记II (区间覆盖 暴力)
  2. Redis5新特性Streams作消息队列
  3. spring cloud alibaba_Spring-Cloud-Alibaba
  4. matlab在电气工程中的数值分析
  5. jquery 1.9里面已经删除了toggle(fn1, fn2)函数:
  6. python面试题及答案-50道Python面试题集锦(附答案)
  7. java 取cpuid、主板id、硬盘id、mac地址
  8. 自学架构设计的一个好方法
  9. mysql超经典的8小时问题-wait_timeout
  10. 同志亦凡人第五季/全集BQueer As Folk 5迅雷下载
  11. 使用jOOQ和JavaFX将SQL数据转换为图表
  12. 管理软raid磁盘队列
  13. java.lang.UnsatisfiedLinkError: JNA support (com/sun/jna/android-arm/libjnidispatch.so) not found
  14. qq批量登录软件_QQ账号永久冻结
  15. 热血江湖Java_热血江湖源码+教程
  16. Violent python - UNIX Password CrackerZipfile Password Cracker
  17. 谈谈Gameplay,以及UE4的Gameplay框架
  18. 联想服务器如何重装win 2012系统,联想电脑如何重装win10操作系统
  19. 苹果手机怎么在照片上添加文字_要给照片快速添加文字、图框、印章,用这款手机软件比较方便...
  20. Linux修改主机名(静态主机名、临时主机名)

热门文章

  1. 亚信安全中标民生银行防病毒项目 为“互联网+金融”革新防护能力
  2. AGG第七课 内存分配策略
  3. Rsync+sersync同步配置
  4. shiro的简单使用
  5. Ansj中文分词Java开发词性分类
  6. 线程池的几个重要参数?—— 七大参数
  7. 常用注解[spring 的 java 配置] ||springboot 热部署
  8. 验证码的编写——本质:图片目的:防止恶意表单注册
  9. tomcat部署项目
  10. c# winform datagridview改变表头标题的颜色(column header)