我的Python分析成长之路7
类
一、编程范式:
1.函数式编程 def
2.面向过程编程 (Procedural Programming)
基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继 续分解直到小问题足够简单到可以在一个小步骤范围内解决。
3.面向对象编程 (object oriented programming)
OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩 展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻 辑,从而使团队开发变得更从容。
#面向对象编程
class Dog():
'''一次小狗的简单模拟类'''
def __init__(self,name,age):
self.name = name
self.age = age
def eating(self,food):
'''模拟小狗吃东西'''
print("%s is eating %s"%(self.name,food))
def running(self):
'''模拟小狗跑步'''
print("%s is running "%self.name)
def main(self):
self.eating("apple")
self.running()
if __name__ == "__main__":
dog1 = Dog("xiaoming",3)
dog1.main()
1.方法__init__():初始化函数,每当实例化类时,python就会自动运行该函数。调用该函数时,会自动传递实参self,它是一个指向实例本身的引用,让实例能访问类中的 属性和方法.__init__()函数中需要的参数,就是实例化类时需要传递的参数
2. 其他方法:通过实例来调用该方法
3.类属性和实例属性 调用时用.调用 类方法也通过.来调用
class Car():
name = "Ryoma"
'''一次汽车的简单模拟类'''
def __init__(self,make,model,year):
'''汽车的属性'''
self.make = make
self.model = model
self.year = year
self.odometer_ing = 0
def get_describe(self):
'''车的描述'''
print(str(self.make)+' '+str(self.model)+' '+str(self.year))
def read_odometer(self):
'''读里程表'''
print("this car has "+str(self.odometer_ing)+' '+"miles ")
def update_odometer(self,miles):
'''更新里程表的数'''
self.odometer_ing += miles
car = Car("AUDI",'A6',1995)
car.update_odometer(100)
print(car.odometer_ing)
car.read_odometer()
二、类的三大特性
1.封装
封装也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏
2.继承
继承是指这样一种能力,它可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。
通过继承创建的类为“子类”或“派生类”。被继承的类称为“父类”或“基类”。
继承实现的方式主要有两种:实现继承、接口继承。实现继承指的是使用基类的属性或方法而无需额外的编码能力。接口继承指使用属性和方法的名称, 但是子类必须提供实现的能力(即重构父类的方法)
class Car():
def __init__(self,make,model,year,fill_gas=100):
'''汽车的属性'''
self.make = make
self.model = model
self.year = year
self.odometer_ing = 0
self.fill_gas = 100
def get_describe(self):
'''车的描述'''
print(str(self.make)+' '+str(self.model)+' '+str(self.year))
def read_odometer(self):
'''读里程表'''
print("this car has "+str(self.odometer_ing)+' '+"miles ")
def update_odometer(self,miles):
'''更新里程表的数'''
self.odometer_ing += miles
def fill_gas_tank(self):
print("this var has %s "%self.fill_gas)
class ElectricCar(Car):
'''创建一个电动车的模拟类'''
def __init__(self,make,model,year):
super(ElectricCar,self).__init__(make,model,year)
self.battery = Battery()
def fill_gas_tank(self):
print("this car has no fill_gas")
class Battery():
'''一次对电池的简单模拟'''
def __init__(self,battery_size=70):
self.battery_size = battery_size
def describe_battery(self):
print("this battery size is %s"%self.battery_size)
ecar = ElectricCar('tesla','s',2000)
ecar.battery.describe_battery()
class Company():
def __init__(self,name,addr,found_year):
self.name = name
self.addr = addr
self.found_year = found_year
def tell(self):
print("公司名为%s,地址是%s,成立于%s"%(self.name,self.addr,self.found_year))
def roll_member(self):
print("\033[31;1m%s正在招人才,大家可以投简历\033[0m"%self.name)
class CompanyMember():
members =0
def __init__(self,name,age):
self.name = name
self.age = age
def roll_member(self):
CompanyMember.members += 1
print("\033[41;1m %s 已被录用,现在公司人数为%s\00[0m"%(self.name,self.members))
class Leader(CompanyMember):
def __init__(self,name,age,salary):
super(Leader,self).__init__(name,age)
self.salary = salary
self.roll_member()
def job(self):
print("%s的工作是CEO"%self.name)
def tell_info(self):
print("my name is %s,age is %s"%(self.name,self.age))
class Putonh(CompanyMember):
def __init__(self,name,age):
super(Putonh,self).__init__(name,age)
self.roll_member()
def tell_info(self):
print("my name is %s,age is %s"%(self.name,self.age))
if __name__ == "__main__":
company = Company("Ryoma Fintech","hangzhou",2020)
company.tell()
company.roll_member()
led = Leader('zqq',24,200000)
led.tell_info()
led.job()
pu = Putonh('a',18)
pu.tell_info()
继承主要有两种继承方式:1.在python2.7经典类中是深度优先继承 2.在2.7新式类中是广度优先继承3.在3.x中都是广度优先
class A(object):
def __init__(self):
print("in the A")
class B(A):
def __init__(self):
print("in the B")
class C(A):
def __init__(self):
print("in the C")
class D(B,C):
# def __init__(self):
# print("in the D")
pass
D()
3.多态
允许你将父对象设置成为和一个或多个子对象相同的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运行,为了实现接口 重用。
class Animal():
def __init__(self,name):
self.name = name
def talk(self):
raise NotImplementedError("Subclass must implement abstract method") class Cat(Animal):
def talk(self):
print("喵喵喵")
class Dog(Animal):
def talk(self):
print("WOw")
def func(obj):
obj.talk()
if __name__ == '__main__':
c1 = Cat('dd')
d1 = Dog("xx")
func(c1)
func(d1) #一个接口,多种实现
class Animal():
def __init__(self,name):
self.name = name
def talk(self):
raise NotImplementedError("Subclass must implement abstract method")
@staticmethod
def animal_talk(obj):
obj.talk()
class Cat(Animal):
def talk(self):
print("喵喵喵")
class Dog(Animal):
def talk(self):
print("WOw") if __name__ == '__main__':
c1 = Cat('dd')
d1 = Dog("xx")
Animal.animal_talk(c1)
Animal.animal_talk(d1)
三、静态方法 @staticmethod 实际上让方法变成与类没关系,变成类下的一个方法,不要传self
四、类方法 @classmethod 只能调用类属性,不能访问实例属性
五、静态方法@property 1.将方法变为静态属性,调用时直接实例+方法名,不加括号
六、其他特殊成员方法
1.__doc__ 表示类的描述信息
2.__module__表示当前操作的对象在哪个模块
3.__class__表示当前操作的类是哪个
4.__init__构造函数,通过类创建对象时,自动触发
5.__del__析构函数,当对象在内存中释放的时候,自动触发
6.__call__对象后面加(),触发执行,或类()()
7.__dict__查看类或对象的所有属性,类.__dict__只能查看类中的属性,对象.__dict__只能查看对象中的属性。
8.__getitem__ /__setitem__/__delitem__用于索引操作,分别对应获得,设置,删除操作
def tell(self):
print("my name is %s"%self.name)
class Foo(object):
def __init__(self):
self.name = 'zz'
def func(self):
return 'func'
foo = Foo()
print(hasattr(foo,'name')) #判断是否有名字属性
print(hasattr(foo,'func')) #判断是否有func方法
print(getattr(foo,'name')) #获得name属性的值
print(getattr(foo,'func')) #获得func对应的函数地址
setattr(foo,"age",18) #设置成员函数
setattr(foo,"tell",tell)
print(getattr(foo,'age'))
fuc = getattr(foo,"tell")
fuc(foo)
delattr(foo,"name") #删除成员函数
我的Python分析成长之路7的更多相关文章
- 我的Python分析成长之路6
模块:本质就是.py结尾的文件.从逻辑上组织python代码. 包: 本质就是一个目录,带有__init__.py文件,从逻辑上组织模块. 模块的分类: 1.标准库(内置的模块) 2.开源库(第三方库 ...
- 我的Python分析成长之路10
matplot数据可视化基础 制作提供信息的可视化(有时称作绘图)是数据分析中最重要任务之一. 1.图片(画布)与子图 plt.figure :创建一张空白的图片,可以指定图片的大小.像素. figu ...
- 我的Python分析成长之路8
Numpy数值计算基础 Numpy:是Numerical Python的简称,它是目前Python数值计算中最为基础的工具包,Numpy是用于数值科学计算的基础模块,不但能够完成科学计算的任而且能够用 ...
- 我的Python分析成长之路11
数据预处理 如何对数据进行预处理,提高数据质量,是数据分析中重要的问题. 1.数据合并 堆叠合并数据,堆叠就是简单地把两个表拼在一起,也被称为轴向链接,绑定或连接.依照轴的方向,数据堆叠可分为横向堆叠 ...
- 我的Python分析成长之路2
2018-12-29 一.python数据类型: 1.数字 int(整形) float(浮点型) complex(复数型) 2.布尔值(bool) 真或假 True or False 3.字符 ...
- 我的Python分析成长之路1
Python是什么? ...
- 我的Python分析成长之路9
pandas入门 统计分析是数据分析的重要组成部分,它几乎贯穿整个数据分析的流程.运用统计方法,将定量与定性结合,进行的研究活动叫做统计分析.而pandas是统计分析的重要库. 1.pandas数据结 ...
- 我的Python分析成长之路5
一.装饰器: 本质是函数,装饰其他函数,为其他函数添加附加功能. 原则: 1.不能修改被装饰函数的源代码. 2.不能修改被装饰函数的调用方式. 装饰器用到的知识: 1.函数即变量 (把函数体赋值给 ...
- 我的Python分析成长之路4
一.函数 1.什么是函数?:函数是带名字的代码块,调用函数,只要调用函数名就可以. 2.函数的性质:1.减少重复代码 2.使程序变得可扩展 3.使程序变得易维护 3.编程范示: 1.面向对象编程 ...
随机推荐
- Spark Mllib里决策树回归分析如何对numClasses无控制和将部分参数设置为variance(图文详解)
不多说,直接上干货! 在决策树二元或决策树多元分类参数设置中: 使用DecisionTree.trainClassifier 见 Spark Mllib里如何对决策树二元分类和决策树多元分类的分类 ...
- 《javascript设计模式》笔记之第十二章:装饰者模式
一.装饰者模式的作用 为函数或者对象的方法添加一些行为. 二.装饰者模式的原理 装饰者模式不是直接修改对象,而是以要修改的对象为基础,新建一个对象.不过这个新建的对象看起来就像在原对象的基础上 ...
- Php—AJAX跨域问题
<?php /** * ajax proxy * ajax跨域解决办法 * @author suconghou <suconghou@126.com> * @version v1. ...
- CSS3学习-用CSS制作立体导航栏
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于Linux系统启动时出现UVD not responding, Trying to reset the vcpu问题的解决
本人的老古董笔记本!不知道什么时候显卡烧坏了 每次启动Linux的时候就会出现错误,信息如下: UVD not responding, trying to reset the VCPU! 讲道理,显卡 ...
- c++中三种继承方式的区别
public公有继承 protected保护继承 private私有继承 我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用. 公有继承时 ...
- Azure 虚拟机安全加固整理
这篇文档不是原创,只是基于Azure官网上的Doc进行了相关链接的整理,从简单层面的安全设置,到更高层面的安全架构考量,以及Azure安全的白皮书及最佳实践,送给需要的你们,定有一款适合你! 做好数据 ...
- JFinal视频教程-JFnal学院分享课
最近JFinal学院出了JFinal视频教程分享课,请笑纳~ 课程列表: 1.[JFinal版]微信小程序富文本渲染解决方案-html2wxml4J分享课 这个课程主要讲的是使用基于JFinal开发的 ...
- 【虚拟机-网络IP】使用 Powershell 设置 VNET 中的静态 IP
本文包含以下内容 对已有虚机设置静态 Internal IP 取消对对已有虚机设置的静态 Internal IP 创建静态 Internal IP的虚机 使用中的注意点 请注意:以下操作需要下载最新版 ...
- 一点对原生HTTP请求的理解与总结
全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/10946165.html,多谢,=.=~ 术语 HTTP:超文本传输协议,规定Web浏览器如何从W ...