Python基础19-面向对象基础
目录
面向对象概述
面向对象的一种实现
类的相关知识
对象的相关知识
面向对象属性的查改增删操作
类属性的查改增删
对象属性的查改增删
关于类、对象属性容易混淆额或忽略的地方的说明
面向对象概述
编程发展至今有面向过程编程、函数式编程、面向对象编程三大流派,未来不知道会不会有面向数据的编程。
Python支持面向对象编程,为什么要面向对象呢?面向对象是个啥?我的粗浅理解,就是将一系列相干的数据、方法封装到一起形成实例,并限制实例的数据、方法调用方式,通过对这个实例的控制达到简化编程过程,提高代码可读性的目的。比如,C++怎么实现面向对象的呢,数据用struct结构封装,成员函数其实就是普通的函数但入参多了个this指针,在调用函数的时候this指针取struct实例的地址,再把这个特殊的struct加个关键字class,这样就实现了class类和类的绝大多数功能。这就是面向对象的实现方法。Java也不例外。那么Python呢?
面向对象的一种实现
Python中,属性数据可以用字典封装,函数可以作为对象被封装在字典里面,函数可以嵌套从而限制其不能在作用域外被调用。根据这个思想,我们可以定义一个狗函数dog,嵌套函数定义狗的两个方法bark、wag_tail,再用字典封装狗的属性。这样就实现了面向对象的设计。调用函数的时候,传入自己作为参数,实际上就是类似C++里面的this指针。
def dog(name, type, gender):def bark(dog):"""狗会叫:return:"""print('%s is wang!wang!' % dog['name'])passdef wag_tail(dog):"""狗会摇尾巴:return:"""print('%s wag tail %s' % (dog['name'], dog['type']))passdef init():"""初始化狗,名字,品种,公母会叫,会摇尾巴:return:"""dog_property = {'name': name,'type': type,'gender': gender,'bark': bark, # 将会叫函数作为属性'wag_tail': wag_tail, # 将会摇尾巴函数作为属性}return dog_propertypassret = init()return retpassd1 = dog('Snoopy', '哈士奇', 'female')
print(d1)
d1['bark'](d1)
d1['wag_tail'](d1)
# {'name': 'Snoopy', 'type': '哈士奇', 'gender': 'femal', 'bark': <function dog.<locals>.bark at 0x00000000028A50D0>, 'wag_tail': <function dog.<locals>.wag_tail at 0x0000000003BAA620>}
# Snoopy is wang!wang!
# Snoopy wag tail 哈士奇d2 = dog('旺财', '柴犬', 'male')
print(d2)
d2['bark'](d2)
d2['wag_tail'](d2)
# {'name': '旺财', 'type': '柴犬', 'gender': 'mail', 'bark': <function dog.<locals>.bark at 0x0000000003BAA6A8>, 'wag_tail': <function dog.<locals>.wag_tail at 0x0000000003BAA730>}
# 旺财 is wang!wang!
# 旺财 wag tail 柴犬
类的相关知识
类描述一类事物共有的数据(属性)和动作(方法)。类本身是没有具体信息的,是一个抽象的类型。类可以具体化到对象。
class Dog:"""这是一个狗类"""fur = 'property fur'def bark():print('from bark')passdef wag_tail(self):print('from wag_tail')passpassprint(Dog)
# <class '__main__.Dog'># 调用类的方法
Dog.bark()
# from bark
Dog.wag_tail('123')
# from wag_tail# 比较dir函数的输出和类__dict__的输出
# 特别是自定义的fur、bark、wag_tail
# dir只列出属性的名字
# __dict__累出属性的名字和值
print(dir(Dog))
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
# '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
# '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
# '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
# '__str__', '__subclasshook__', '__weakref__', 'bark', 'fur', 'wag_tail']
print(Dog.__dict__)
# {'__module__': '__main__',
# '__doc__': '\n 这是一个狗类\n ',
# 'fur': 'property fur',
# 'bark': <function Dog.bark at 0x0000000003BBA620>,
# 'wag_tail': <function Dog.wag_tail at 0x0000000003BBA6A8>,
# '__dict__': <attribute '__dict__' of 'Dog' objects>,
# '__weakref__': <attribute '__weakref__' of 'Dog' objects>}# Dog类里面有fur属性,可以用类名直接调用
print(Dog.fur)
# Dog的__dict__属性,查看类的属性字典
# 上面直接调用Dog.fur实际上也是用属性字典实现的
print(Dog.__dict__['fur'])print(Dog.__name__) # 类的名字Dog
print(Dog.__doc__) # 类的说明文档,也就是类定义后紧跟的说明"""这是一个狗类""""
print(Dog.__bases__) # Python支持多继承,后面仔细研究,__bases__以元组形式列出了所以父类(<class 'object'>,)
对象的相关知识
我们在面向对象的一种实现那一节用函数实现了面向对象的设计。Python内置了面向对象编程的设计。
我们自己嵌套定义的初始化函数init,Python类里面有内置的__init__方法来初始化,__init__必须有self入参,自动将实例本身传给self。自动进行初始化和返回实例,因此__init__不用return。类创建实例的过程和函数调用类似。
对象只保存数据属性,不保存方法属性。这样,每个对象存自己的数据,共享一份方法。
对象调用方法的时候,将对象本身传给self参数。通过self来访问对象各自的数据。
class Dog:"""这是一个狗类"""fur = 'property fur'def __init__(self, name, breed, gender):self.name = nameself.breed = breed # 品种self.gender = genderpassdef bark(self):print('%s 汪汪!' % self.name)passdef wag_tail(self):print('%s 摇尾巴' % self.name)passpassd1 = Dog('旺财', '中华田园犬', 'male')
print(d1)
# <__main__.Dog object at 0x00000000026D9BA8># __dict__查看对象的属性字典
# 对象只保存数据属性,不保存方法
print(d1.__dict__)
# {'name': '旺财', 'type': '中华田园犬', 'gender': 'male'}# 调用对象的属性
# 对象有的(__init__)直接调用 name
# 对象没有的,到外面的作用域类里面去找 fur
print(d1.name, d1.fur)# 对象调用方法是调用类的方法,调用时将对象传给self参数
Dog.bark(d1)
d1.bark()
# 旺财 汪汪!
面向对象属性的查改增删操作
Python的面向对象支持属性的查改增删。类的属性、对象的属性都可以查改增删。
以前用Java知道可以查、改属性,学了Python才知道属性还可以增、删,而且是数据属性和方法属性的查改增删,真牛逼。
类属性的查改增删
我们做查改增删,对比类的属性字典__dict__的内容和调用情况。直接看代码例子……
class Dog:"""这是一个狗类"""fur = 'property fur'def __init__(self, name, breed, gender):self.name = nameself.breed = breed # 品种self.gender = genderpassdef bark(self):print('%s 汪汪!' % self.name)passdef wag_tail(self):print('%s 摇尾巴' % self.name)passdef eat_food(self, food):print('%s 吃 %s' % (self.name, food))passpassd1 = Dog('旺财', '中华田园犬', 'male')
d2 = Dog('123', '中华田园犬', 'male')# ========== 类属性的查 ==========print(Dog.fur)
# property furprint('查询', Dog.__dict__)
# 查询
# {'__module__': '__main__',
# '__doc__': '\n 这是一个狗类\n ',
# 'fur': 'property fur',
# '__init__': <function Dog.__init__ at 0x0000000003BAA620>,
# 'bark': <function Dog.bark at 0x0000000003BAA6A8>,
# 'wag_tail': <function Dog.wag_tail at 0x0000000003BAA730>,
# 'eat_food': <function Dog.eat_food at 0x0000000003BAA7B8>,
# '__dict__': <attribute '__dict__' of 'Dog' objects>,
# '__weakref__': <attribute '__weakref__' of 'Dog' objects>}# ========== 类属性的改 ==========Dog.fur = 'modify fur'
print(Dog.fur)# 改方法属性
def test(self):print('%s 是 %s 品种' % (self.name, self.breed))pass# 方法属于类,可以在类上改方法属性
# 修改后调用eat_food其实调用的是test
Dog.eat_food = test
d1.eat_food()
# 旺财 是 中华田园犬 品种# 可以看到eat_food的地址已经发生了变化,变成了test函数的地址
print(test)
# <function test at 0x00000000028950D0>
print('修改', Dog.__dict__)
# 修改
# {'__module__': '__main__',
# '__doc__': '\n 这是一个狗类\n ',
# 'fur': 'modify fur',
# '__init__': <function Dog.__init__ at 0x0000000003BAA620>,
# 'bark': <function Dog.bark at 0x0000000003BAA6A8>,
# 'wag_tail': <function Dog.wag_tail at 0x0000000003BAA730>,
# 'eat_food': <function test at 0x00000000028B50D0>,
# '__dict__': <attribute '__dict__' of 'Dog' objects>,
# '__weakref__': <attribute '__weakref__' of 'Dog' objects>}# ========== 类属性的增 ==========# 增加数据属性——项圈
Dog.ring = 'leather'# 增加方法属性
def play_ball(self):print('%s 玩球' % self.name)pass# 方法属于类,可以在类上增加方法属性play_ball
Dog.play_ball = play_ball
d1.play_ball()
# 旺财 玩球# 可以看到增加属性以后__dict__里面增加了ring属性、play_ball方法
print('增加', Dog.__dict__)
# 增加
# {'__module__': '__main__',
# '__doc__': '\n 这是一个狗类\n ',
# 'fur': 'modify fur',
# '__init__': <function Dog.__init__ at 0x0000000003BAA620>,
# 'bark': <function Dog.bark at 0x0000000003BAA6A8>,
# 'wag_tail': <function Dog.wag_tail at 0x0000000003BAA730>,
# 'eat_food': <function test at 0x00000000028C50D0>,
# '__dict__': <attribute '__dict__' of 'Dog' objects>,
# '__weakref__': <attribute '__weakref__' of 'Dog' objects>,
# 'ring': 'leather',
# 'play_ball': <function play_ball at 0x0000000003BAA7B8>}# ========== 类属性的删 ==========# 删除数据属性
del Dog.ring# 删除方法
# 方法属于类,可以在类上删除
del Dog.eat_food# 注意比较删除前后的属性字典,删除ring以后就没有ring了,删除以后就没有eat_food方法了
print('删除', Dog.__dict__)
# 删除
# {'__module__': '__main__',
# '__doc__': '\n 这是一个狗类\n ',
# 'fur': 'modify fur',
# '__init__': <function Dog.__init__ at 0x0000000003BAA620>,
# 'bark': <function Dog.bark at 0x0000000003BAA6A8>,
# 'wag_tail': <function Dog.wag_tail at 0x0000000003BAA730>,
# '__dict__': <attribute '__dict__' of 'Dog' objects>,
# '__weakref__': <attribute '__weakref__' of 'Dog' objects>,
# 'play_ball': <function play_ball at 0x0000000003BAA7B8>}
对象属性的查改增删
我们做查改增删,对比对象的属性字典__dict__的内容和调用情况。直接看代码例子……
class Dog:"""这是一个狗类"""fur = 'property fur'def __init__(self, name, breed, gender):self.name = nameself.breed = breed # 品种self.gender = genderpassdef bark(self):print('%s 汪汪!' % self.name)passdef wag_tail(self):print('%s 摇尾巴' % self.name)passdef eat_food(self, food):print('%s 吃 %s' % (self.name, food))passdef play_ball(self, ball):print('%s 玩 %s' % (self.name, ball))passpassd1 = Dog('旺财', '中华田园犬', 'male')
d2 = Dog('123', '中华田园犬', 'male')# ========== 对象属性的查 ==========print(d1.name)
print(d2.name)
# 旺财
# 123d1.play_ball('篮球')
d2.play_ball('篮球')
print(d1.play_ball)
# 旺财 玩 篮球
# 123 玩 篮球
# <bound method Dog.play_ball of <__main__.Dog object at 0x0000000003B9D8D0>>
# 打印d1.play_ball实际访问的是类Dog.play_ballprint(d1.__dict__)
print(d2.__dict__)
# {'name': '旺财', 'breed': '中华田园犬', 'gender': 'male'}
# {'name': '123', 'breed': '中华田园犬', 'gender': 'male'}# ========== 对象属性的增 ==========# 增加数据属性
d1.age = 10
print(d1.__dict__)
print(d2.__dict__)
# {'name': '旺财', 'breed': '中华田园犬', 'gender': 'male', 'age': 10}
# {'name': '123', 'breed': '中华田园犬', 'gender': 'male'}# 对象可以增加方法属性吗?
# 理论和技术上可以这么做,那么增加的方法就只属于这个对象。
# 这违背了对象实例只有数据属性的原则,不要这么做!!!# ========== 对冲属性的改 ==========d1.age = 17
print(d1.age)
# 17# ========== 对象属性的删 ==========del d1.age
del d2.name
print(d1.__dict__)
print(d2.__dict__)
# {'name': '旺财', 'breed': '中华田园犬', 'gender': 'male'}
# {'breed': '中华田园犬', 'gender': 'male'}
关于类、对象属性容易混淆额或忽略的地方的说明
挺绕的,直接看代码例子里的注释吧……
fur = 'yellow'class Dog:"""这是一个狗类"""fur = 'property fur'li = ['a', 'b']li2 = ['x', 'y']def __init__(self, name, breed, gender):self.name = nameself.breed = breed # 品种self.gender = genderprint('--->', fur)passpass# __init__里面既不是self的也不是作用域内的ring
# 那么就是全局的ring,和类已经没有关系了
d1 = Dog('旺财', '中华田园犬', 'male')
d2 = Dog('123', '中华田园犬', 'male')
# ---> yellow
# ---> yellow# 数据属性就是属于各自的Dog.fur = 'yellow'
d1.fur = 'white'
d2.fur = 'gray'
print('类的毛:', Dog.fur)
print('对象d1的毛:', d1.fur)
print('对象d2的毛:', d2.fur)
# 类的毛: yellow
# 对象d1的毛: white
# 对象d2的毛: gray# 由于li是类的属性
# 通过d1调用li的append并没有给对象新增任何属性
# 所以修改的就是类的li,因此li都是['a','b','c']
d1.li.append('c')
print(Dog.li)
print(d1.li)
print(d2.li)
# ['a', 'b', 'c']
# ['a', 'b', 'c']
# ['a', 'b', 'c']# 由于li2也是类的属性
# 但是,d2.li2=是给d1对象新增了一个属性,这与上面append不同
# 所以修改的是d2.li2的属性
d1.li2 = [1, 2, 3]
print(Dog.li2)
print(d1.li2)
print(d2.li2)
# ['x', 'y']
# [1, 2, 3]
# ['x', 'y']# 此时,再对d1和d2的li2操作,已经有本质的不同了
# d1的li2是d1自己的
# d2的li2是类的
# 这一点可以从对象的__dict__可以看出
d1.li2.append('c')
d2.li2.append('z')
print(Dog.li2)
print(d1.li2)
print(d2.li2)
print(d1.__dict__)
print(d2.__dict__)
# ['x', 'y', 'z']
# [1, 2, 3, 'c']
# ['x', 'y', 'z']
# {'name': '旺财', 'breed': '中华田园犬', 'gender': 'male', 'fur': 'white', 'li2': [1, 2, 3, 'c']}
# {'name': '123', 'breed': '中华田园犬', 'gender': 'male', 'fur': 'gray'}
相关文章:

《一杯沧桑》有感
《一杯沧桑》 “每一个人的一生, 都是一仅仅杯子。 仅仅是杯子的大小不一样。 有些杯子, 它能够装下一片汪洋, 而有些杯子, 它却装不下一点忧伤。 …

Android架构篇-3 网络接口封装
Android架构篇-3 网络接口封装 实现功能: 1.暴露参数请求地址url、请求方法method、请求参数params、请求头header、请求响应response、https请求证书 2.支持get、post、文件上传下载、https证书 以封装OKhttp为例: 接口定义 业务层接口定义 public class BusinessSer…

域中计算机设定重启,域中添加计算机设定的步骤
我来和你详细说下吧!既然你已经建立域了,那么就好办了!1。为各台电脑建立域帐号!2.在每台电脑上加域!a、首先在每台电脑上将用户的权限降到USER。b、右键选我的电脑,在计算机名称里面把域一栏里面输入你自己…

浅谈 拓扑排序
我是什么时候想到要学拓扑排序的呢? 在一次模考的时候,有这样一道题,叫做食物链,我是写了记忆化搜索的,然而全场都写了拓扑板子 后来发现我居然不会这么基础的算法,有点慌 下面进入正题 拓扑排序是针对一些…

Python基础20-面向对象:静态、组合、继承与派生、多态、封装、反射、内置attr方法等
目录 静态 静态属性property 类方法classmethod 静态方法staticmethod 组合 继承与派生 继承与派生 继承顺序 在子类中调用父类方法与super 多态 封装 反射 模块的动态导入 内置的attr方法 带双下户线的attr方法__setattr__、__getattr__、__delattr__ __getat…

C++ primer 第三章笔记
chapter 3 字符串,向量,数组 # 命名空间的using声明 头文件不应包含using声明; 注:using namespace std; #标准库类型string 1.string 表示可变长的字符序列; 2.#include<string> 3.字符串字面量 与 string 是不同类型; 4.cctype头文件种定义了一组标准库函数(改变某个字…

街篮最新服务器,《街篮》全新两组服务器开启 与你一起迎新年!
2016还剩下几个小时,2017即将到来。为了庆祝新的一年到来,《街篮》两组全新的服务器“闻鸡起舞”与“金鸡独立”正式与大家见面!本次新服务器将在官服和混服同时开启,其中“闻鸡起舞”属于G系的新服务器,而“金鸡独立”…

Android架构篇-4 架构模式MVVM
Android架构篇-4 架构模式MVVM MVVM原理 #mermaid-svg-CJmTYPxP5GkKNMic .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-CJmTYPxP5GkKNMic .label text{fill:#333}#mermaid-svg-CJmTYPxP5GkKNM…

jupyter安装与初探
安装jupyter jupyterlab和jupyter notebook的关系暂时没有搞清楚。先都安装了吧,用用再说。 选择国内镜像,避免万里长城的干扰。 pip install jupyterlab -i http://uni.mirrors.163.com --trust-host uni.mirrors.163.com pip install jupyter noteb…

android专题-数据库Room
android专题-数据库Room Room介绍 room是Google官方推荐的ORM数据库框架,抽象出sqlite访问的数据库。 包含三大组件: Entity 定义 表结构,每个entity类对一个表,默认会把entity类所有字段都创建为表字段Dao 定义entity类的CRUD…

CentOS 6.7快速搭建lamp环境
安装前要关闭防火墙,防止外网不能访问,这一点很重要,要不然外网访问不了; ①关闭防火墙:service iptables stop ②永久关闭防火墙:chkconfig iptables off ③查看防火墙状态:service iptables …

1005 生日礼物
1005 生日礼物 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题解题目描述 Description9月12日是小松的朋友小寒的生日。小松知道小寒特别喜欢蝴蝶,所以决定折蝴蝶作为给小寒的生日礼物。他来到了PK大学最大的一家地下超市,在超市里,…

css多行省略号兼容ie,css超出2行部分省略号……,兼容ie
html>Page Title.wrap {height: 40px;line-height: 20px;overflow: hidden;}.wrap .text {float: right;margin-left: -5px;width: 100%;word-break: break-all;}.wrap::before {float: left;width: 5px;content: ‘‘;height: 40px;}.text {position: relative;line-height…

机器学习01-定义、线性回归、梯度下降
目录 一、定义 What is Machine Learning 二、建模 Model Representation 三、一元线性回归 Linear Regression with One Variable 3.1 一元线性归回的符号约定 Notation 3.2 一元线性回归 Linear Regression with One Variable 3.3 代价函数 Cost Function 3.4 梯度下降…

android专题-蓝牙扫描、连接、读写
android专题-蓝牙扫描、连接、读写 概念 外围设备 可以被其他蓝牙设备连接的外部蓝牙设备,不断广播自身的蓝牙名及其数据,如小米手环、共享单车、蓝牙体重秤 中央设备 可以搜索并连接周边的外围设备,并与之进行数据读写通讯,…

2 并发编程--开启进程的两种方式
multiprocessing 英 /mʌltɪprəʊsesɪŋ/ n. [计][通信] 多重处理 1、multiprocessing 模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多…

POJ 2112 Optimal Milking(二分+最大流)
POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛。问全部奶牛都能挤上奶,那么走的距离最大的奶牛的最小…
ajax的loading方法,Ajax加载中显示loading的方法
使用ajaxStart方法定义一个全局的“加载中。。。”提示$(function(){$("#loading").ajaxStart(function(){$(this).html.("");});$("#loading").ajaxSuccess(function(){$(this).html.("");// $(this).empty(); // 或者直接清除});});…
机器学习02-分类、逻辑回归
目录 一、分类问题 Classification 二、分类问题的估值 Hypothesis Representation 三、分类问题的决策边界 Decision Boundary 四、分类问题的代价函数 Cost Function 五、简化的代价函数与梯度下降Simplified Cost Function & Gradient Descent 5.1 简化代价函数 …

python绘制盖尔圆并做特征值的隔离
本程序并非智能到直接运行隔离出所有特征值,而是需要高抬贵手,手动调节变换矩阵D的参数,以实现特征值的隔离。若期待直接找到能特征值隔离的D矩阵参数变化范围,怕足下要失望了,鄙人暂没有做到那一步,一是因…

mysql 电商项目(一)
mysql 电商项目 - MySQL数据库开发规范 1、数据库基本设计规范 2、索引设计规范 3、数据库字段设计规范 4、数据库SQL开发规范 5、数据库操作行为规范 转载于:https://www.cnblogs.com/Eric15/articles/9719814.html

Android专题-常用第三方框架
Android专题-常用第三方框架 HTTP网络请求 带*号的是个人推荐比较好用的 HTTP网络请求 okhttp * :https://github.com/square/okhttp retrofit:https://github.com/square/retrofit Volley:https://github.com/google/volley Android Async HTTP:https://github.com/andr…

WPF显示经常使用的几个显示文字控件TextBox, TextBlock, Lable
WPF显示经常使用的几个显示文字控件TextBox, TextBlock, Lable TextBox, TextBlock。 Lable 当中TextBox 和Lable均继承了Control类 能够对其进行模板编辑。而TextBlock没有继承Control所以不能对其进行模板编辑 我的程序中须要做一个二级菜单…
机器学习03-神经网络
目录 一、非线性估值Non-Linear Hypothesis 二、神经网络建模 Neural Network 三、复习逻辑回归问题矩阵式 3.1 没有进行正则化 3.2 进行正则化 四、神经网络的代价函数 4.1 符号约定Notation 4.2 代价函数 五、反向传播算法 Backpropagation Alg 5.1 任务 5.2 一个…

python 打包
一、下载 pip install Pyinstaller 二、使用Pyinstaller 1、使用下载安装的方式安装的Pyinstaller打包方式 将需要打包的文件放在解压得到的Pyinstaller文件夹中,打开cmd窗口,把路径切换到当前路径打开命令提示行,输入以下内容(最…

iOS架构篇-3 网络接口封装
iOS架构篇-3 网络接口封装 关键字:iOS,网络接口封装,Alamofire,swift 网络接口API通常都需要自己封装一套管理,这里以swift版的Alamofire为例. 实现功能: 1.暴露参数请求地址url、请求方法method、请求参数params、请求头header、请求响应response(响应数据、响应头resp…

coursera 《现代操作系统》 -- 第十一周 IO系统
本周要求 错题 下列I/O控制方式中,哪一个不需要硬件支持? 中断方式 轮询方式 DMA方式 I/O处理机方式 中断方式:中断控制器 轮询方式:CPU不断查询设备以了解其是否就绪 DMA:使用到了 DMA 控制器 4。 在设备管理中,缓冲…

matlab图形绘制基础(东北大学MOOC笔记)
%% 二维图形绘制 % 多纵轴曲线绘制 figure(1); t 0:0.01:2*pi; y1 sin(t); y2 10*cos(t); % plotyy(t, y1, t, y2); yyaxis left plot(t, y1); ylim([min(y1), max(y1)]); yyaxis right plot(t, y2); ylim([min(y2), max(y2)]);% 绘制极坐标图 figure(2); theta 0 : 0.01 :…

【转载】pycharm远程调试配置
pycharm远程调试配置https://www.cnblogs.com/liangjiongyao/p/8794324.html

Tornado 类与类组合降低耦合
转载于:https://www.cnblogs.com/shiluoliming/p/6760548.html