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& ...
随机推荐
- AlertConfirmDialog【基于AlertDialog的确认取消对话框】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 确认取消对话框,基于AlertDialog.不是基于DialogFragment. 按钮文本可以根据实际情况更换. 效果图 代码分析 ...
- 强化学习(十)Double DQN (DDQN)
在强化学习(九)Deep Q-Learning进阶之Nature DQN中,我们讨论了Nature DQN的算法流程,它通过使用两个相同的神经网络,以解决数据样本和网络训练之前的相关性.但是还是有其他 ...
- 30分钟ES6从陌生到熟悉
前言 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的 ...
- [翻译] 使用 Python 创建你自己的 Shell:Part I
目录 使用 Python 创建你自己的 Shell:Part I 原文链接与说明 步骤 0:项目结构 步骤 1:Shell 循环 步骤 2:命令切分 步骤 3:执行 运行 使用 Python 创建你自 ...
- Cookie浅析
Cookie 翻阅了好久关于Cookie的博客及文档,感觉一直有一块结没有解开,所以一直难以在脑中形成一个顺畅的知识脉络.最后实在是遭不住,拉上我的大神朋友在食堂里坐了3个小时,问了个底朝天!总算形 ...
- NFS服务和DHCP服务讲解(week3_day2)--技术流ken
NFS服务端概述 NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS: NFS允许一个系统在网络上与他人共享目录 ...
- golang实现aes-cbc-256加密解密过程记录
我为什么吃撑了要实现go的aes-cbc-256加密解密功能? 之前的项目是用php实现的,现在准备用go重构,需要用到这个功能,这么常用的功能上网一搜一大把现成例子,于是基于go现有api分分钟实现 ...
- WebApi中使用Ninject 依赖注入
之前Ninject依赖注入是在MVC中使用,最近在WebApi中使用,用之前的MVC方式发现使用接口注入,一直是Null错误,网上查询了一些资源,总结一下,以后备用. 主要分为以下几步骤: 在NuGe ...
- MySQL 笔记整理(14) --count(*)这么慢,我该怎么办?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 14) --count(*)这么慢,我该怎么办? 有时你会发现,随着系统 ...
- mysql命令查看表结构及注释
使用如下命令:select table_schema,table_name,column_name,column_type,column_key,is_nullable,column_default, ...