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 = 7
height = 175
def __init__(self,name,age=23):
self.name = name
self.age = age tom = 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 = name
return cls
return wrapper @add_name1('tom')
class Person:
AGE = 1 print(Person.NAME)
类方法和静态方法
普通函数
类方法
静态方法
方法的调用
class Person:
def normal_method():
print('nomal') def method(self):
print("{}'s method ".format(self)) @classmethod
def class_method(cls):
print('class = {0.__name__} {0}'.format(cls))
cls.HEIGHT =175 @staticmethod
def 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_score def monkeypatch4Person():
Person.get_score = get_score print(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 = chinese
self._eng = english
self.__his = history def gethis(self):
return self.__his def sethis(self,value):
self.__his = value def seteng(self,value):
self._eng = value @property
def chinese(self):
return self._chinese @chinese.setter
def chinese(self,value):
self._chinese = value @chinese.deleter
def chinese(self):
# del self._chinese
print('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)#
student.chinese = 100
print(student.chinese)#
del student.chinese
print(student.eng)#
student.eng =110
print(student.eng)#
对象的销毁
方法重载(overload)
重写也就是覆盖的意思,即override。
封装
练习
#1.其结构值得参考!
from random import randint
class RandomGenerator:
def __init__(self,count=10,start=1,stop=100):
self.count = count
self.start = start
self.stop = stop
self.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 = count
return next(self.gen) rg = RandomGenerator()
lst = rg.gengerate(10)
print(lst)
#
class Point:
def __init__(self,x,y):
self.x = x
self.y = y def __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]
#
class Car:
def __init__(self,mark=None,color=None,price=None,speed=None):
self._mark = mark
self._color = color
self._price = price
self._speed = speed class CarInfo:
def __init__(self):
self.lst = [] def addcar(self,car:Car):
self.lst.append(car) def showcarinfo(self):
return self.lst
#
class Temperature:
def __init__(self,t,unit='c'):
self._c = None
self._f = None
self._k = None
if unit == 'k':
self._c = self.k2c(t)
self._k = t
elif unit == 'f':
self._c = self.f2c(t)
self._f = t
else:
self._c = t @property
def k(self):
if self._k is None:
self._k = self.c2k(self._c)
return self._k @property
def f(self):
if self._f is None:
self._f = self.c2f(self._c)
return self._f @property
def c(self):
return self._c @classmethod
def c2f(cls,c):
return c*9/5+32 @classmethod
def f2c(cls,f):
return (f-32)*5/9 @classmethod
def c2k(cls,c):
return c+273.15 @classmethod
def k2c(cls,k):
return k-273.15 @classmethod
def f2k(cls,f):
return cls.c2k(cls.f2c(f)) @classmethod
def 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 = 0
BLUE = 1
GREEN = 2
BLACK = 3
GOLDEN = 4
OTHER = 100 class Item:
def __init__(self,**kwargs):
self.__info = kwargs def __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.items mycart = 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())
Python进阶8---面向对象基础1的更多相关文章
- Python进阶(十三)----面向对象
Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- python进阶08 MySQL基础补充
python进阶08 MySQL基础补充 本次课程都是基于三张表格的使用 一.子查询 #如何找到‘张三’的成绩 #思路:先找到张三的学号,在拿这个张三的学号到成绩表里面去匹配,得出成绩 #如何用一条查 ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)
day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库: 简称:DataBase ---->DB 数据库即存放数据的仓库, ...
- Python进阶之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- python之路 面向对象基础 XML
一.面向对象基础 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...
- Python学习之面向对象基础
python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...
- Python进阶之面向对象编程(二)
Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
- Python进阶之面向对象编程概述
Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
随机推荐
- 多元线性回归公式推导及R语言实现
多元线性回归 多元线性回归模型 实际中有很多问题是一个因变量与多个自变量成线性相关,我们可以用一个多元线性回归方程来表示. 为了方便计算,我们将上式写成矩阵形式: Y = XW 假设自变量维度为N W ...
- Vue2.0源码阅读笔记(一):选项合并
Vue本质是上来说是一个函数,在其通过new关键字构造调用时,会完成一系列初始化过程.通过Vue框架进行开发,基本上是通过向Vue函数中传入不同的参数选项来完成的.参数选项往往需要加以合并,主要有 ...
- 解读经典《C#高级编程》继承 页107-113.章4
前言 本章节开始讲接口. 接口 接口的声明很像抽象类,有方法的声明但无方法体.但它比抽象类限制更多.和类比起来,接口的定义有众多限制. 接口只能包含声明,而无方法体 接口只能包含方法.属性.索引器.事 ...
- Spring+MyBatis整合过程
步骤: 1.引入Spring+MyBatis开发包 >spring(ioc aop dao)开发包 >mybatis开发包,dbcp,驱动包 >mybatis-spring.jar整 ...
- 剑指前端(前端入门笔记系列)—— JS基本数据类型及其类型转换
基本数据类型 ECMAScript中有5中简单数据类型性(也称为基本数据类型):Undefined.Null.Boolean.Number和String,还有一种复杂数据类型——Object,Obje ...
- git 取消对某个文件的跟踪
git rm --cached <fileName> 例如 : git add 后,不想提交在status里的.idea/vcs.xml.操作如下:
- 都 9012了,该选择 Angular、React,还是Vue?
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 尽管 Web开发的典型应用场景除了将服务器用作平台.浏览器用作客户端之外,几乎很少活跃于其他业务领域,但不可 ...
- C语言货架01
教材: < C程序设计(第四版) > 谭浩强著 清华大学出版社 教材目录 第1章 程序设计和C语言 第2章 算法——程序的灵魂 第3章 最简单的C程序设计— ...
- Django-2- 模板路径查找,模板变量,模板过滤器,静态文件引用
模板路径查找 路径配置 2. templates模板查找有两种方式 2.1 - 在APP目录下创建templates文件夹,在文件夹下创建模板 2.2 - 在项目根目录下创建templates文件夹, ...
- 浅谈SQL Server数据内部表现形式
在上篇文章 浅谈SQL Server内部运行机制 中,与大家分享了SQL Server内部运行机制,通过上次的分享,相信大家已经能解决如下几个问题: 1.SQL Server 体系结构由哪几部分组成? ...