Python进阶8---面向对象基础1
面向对象
语言的分类
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相关推荐
- python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)
回顾 在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用.今天我们继续讲一下Python中面向对象的相关知识点 ...
- python进阶《面向对象编程》类和对象
目录 零.前言 一.面向对象编程 (一)概念理解 二.类和对象的概念 (一)面向对象的两个重要概念类和对象. (二)类的解释 1.创建类 2.类属性(区别于下面的对象属性) (三)对象的解释 ...
- Python OOP:面向对象基础,定义类,创建对象/实例,self,创建多个对象,添加对象属性,访问对象属性,__init__方法,带参数的__init__,__str__方法,__del__方法
一.理解面向对象 面向对象是⼀种抽象化的编程思想,很多编程语⾔中都有的⼀种思想. ⾯向对象就是将编程当成是⼀个事物,对外界来说,事物是直接使用的,不用去管他内部的情况.⽽编程就是设置事物能够做什么事. ...
- Python进阶--网络爬虫基础
Python网络爬虫基础 一.网络请求 ProxyHandler处理器(代理): request库 发送get请求: 发送post请求: 使用代理 requests 处理cookie 信息.处理不信任 ...
- Python 进阶_OOP 面向对象编程_组合与继承
#目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...
- Python 进阶_OOP 面向对象编程_实例属性和方法
目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...
- Python学习:面向对象基础练习——士兵突击(代码演示) 及 身份运算符
1.面向对象封装案例II--士兵突击 目标 士兵突击案例 身份运算符 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 -- 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 ...
- 个人python学习-Day7面向对象基础(上)
一.面向对象介绍 1.概述 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:将数据与函数绑定到一起,进行封装,这样能够更快速的 ...
- Python 进阶_OOP 面向对象编程_self 的实例绑定
目录 目录 self 和绑定 调用非绑定的方法 self 和绑定 在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时 ...
- Python 进阶_OOP 面向对象编程_类属性和方法
目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象 ...
最新文章
- 【HDU】4509 湫湫系列故事——减肥记II (区间覆盖 暴力)
- Redis5新特性Streams作消息队列
- spring cloud alibaba_Spring-Cloud-Alibaba
- matlab在电气工程中的数值分析
- jquery 1.9里面已经删除了toggle(fn1, fn2)函数:
- python面试题及答案-50道Python面试题集锦(附答案)
- java 取cpuid、主板id、硬盘id、mac地址
- 自学架构设计的一个好方法
- mysql超经典的8小时问题-wait_timeout
- 同志亦凡人第五季/全集BQueer As Folk 5迅雷下载
- 使用jOOQ和JavaFX将SQL数据转换为图表
- 管理软raid磁盘队列
- java.lang.UnsatisfiedLinkError: JNA support (com/sun/jna/android-arm/libjnidispatch.so) not found
- qq批量登录软件_QQ账号永久冻结
- 热血江湖Java_热血江湖源码+教程
- Violent python - UNIX Password CrackerZipfile Password Cracker
- 谈谈Gameplay,以及UE4的Gameplay框架
- 联想服务器如何重装win 2012系统,联想电脑如何重装win10操作系统
- 苹果手机怎么在照片上添加文字_要给照片快速添加文字、图框、印章,用这款手机软件比较方便...
- Linux修改主机名(静态主机名、临时主机名)
热门文章
- 亚信安全中标民生银行防病毒项目 为“互联网+金融”革新防护能力
- AGG第七课 内存分配策略
- Rsync+sersync同步配置
- shiro的简单使用
- Ansj中文分词Java开发词性分类
- 线程池的几个重要参数?—— 七大参数
- 常用注解[spring 的 java 配置] ||springboot 热部署
- 验证码的编写——本质:图片目的:防止恶意表单注册
- tomcat部署项目
- c# winform datagridview改变表头标题的颜色(column header)