python --面向对象
面向对象 :详解
- 类(class) :用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也成为了方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是咋类的其他成员方法之外声明的。
- 继承:极易个派生类继承基类的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数
- 对象:通过类定义的数据结果实例。对象包括两个数据成员(类变量和实例变量)和方法。
- 简单的一个实例:
class Test: #类定义i = 123 #直接在类中放属性和属性值def fn(name):#print("输入的名字是:", name)return 'hello,wolrd'x = Test() #实例化该类 #访问该类的属性 print("Test这个类中i的值为:", x.i) #Test这个类中i的值为: 123 #x.fn(cassie) 这样调用类中的函数会报错? #访问该类的方法 print(x.fn())
_init_() ---构造方法(init前后分别为_ _两个下划线,否则会报错),由于很多类都倾向于将对象创建为有初始状态的,所以类可能会定义一个_int_()
def _init_(self):self.data = []
- 错误提示TypeError: Complex() takes no arguments-----不接收任何参数
- 类的方法:
- 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数:
class People:name = ''age = 0#定义私有属性,私有属性在类外部无法直接进行访问__weight = 0def __str__(self):return self.__weight#定义构造方法def __init__(self, n, a, w): #self为实例化本身,类似于js的thisself.name = nself.age = aself.__weight = wdef speak(self):print("%s 说:我 %d 岁。"%(self.name, self.age)) '''("%s 说:我 %d 岁。")此时的%s和%d均为参数,行参,需要在后面给他加上实参,需要加%比如("%a 前面为要传入的参数,后面这个是传入的实参"%(self.name ###此时就是实参))'''#实例化
p = People('cassie', 10, 3)
p.speak()
class People:name = ''age = 0sex = 'f'def __str__(self): #把名字直接展示出来,在直接print实例化对象时return self.name def __init__(self, name): #接收参数self.name = name #修改上面的name属性的值#print('this is start')def like_apple(self): #需要调用此函数if self.sex == 'f':print('女性爱吃苹果')elif self.sex == 'n':print('男性不爱吃苹果')else:print('没有性别,无法判断')print(self.name, self.age)a = People('cassie') #实例化
a.like_apple() #调用自己写的函数
'''
输出结果为:女性爱吃苹果
cassie 0
'''
print(a) #因为上面写了__str__这个方法,所以在print时,直接返回了名字
- 继承:
- BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
#定义一个主类
class people:name = ''age = 0def __init__(self):self.name = nameself.age = agedef speak(self):print("%s 说:我%d 岁了。"%(self.name, self.age))#继承实例,在定义一个类来继承主类
class student(people):grade = ''def __init__(self,name, age, grade):people.__init__(self, name,age)self.grade = grade#复写父类的方法:def speak(self):print("%s 说:我今年%d 岁了,上 %d 年级"%(self.name, self.age, self.grade))#初始化类
s = student('cassie', 10, 3)
#调用该类的方法
s.speak() #######输出结果为
cassie说我10岁了,上3年级
- 多继承
- 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,Python 从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
class Example(Lei1,Lei2)
#定义一个主类
class People:name = ''age = 0def __init__(self):self.name = nameself.age = agedef speak(self):print("%s 说:我%d 岁了。"%(self.name, self.age))#继承实例,在定义一个类来继承主类
class Student(people):grade = ''def __init__(self,name, age, grade):People.__init__(self, name,age)self.grade = grade#复写父类的方法:def speak(self):print("%s 说:我今年%d 岁了,上 %d 年级"%(self.name, self.age, self.grade))#在定义一个父类
class Speaker():name = ''language = 'c'def __init__(self, name, language):self.name = nameself.language = languagedef speak(self):print("我叫%s ,我说%d 语言"%(self.name, self.language))#多继承
class More(Speaker,Student):a = ''def__init__(self, name, age, grade, language):Student.__init__(self, name, age, grade)Speaker.__init__(self, name, language)test = More('liu', 10, 3, '中文')
test.speak() #因为这两个类中的方法均定义为speak,所以在调用方法时,默认调用前面父类的方法,所以调用的是Speaker这个类中的方法######输出结果为
我叫刘,我说中文语言
- 方法重写
- 在继承时,父类的方法不满足需求时,可以在子类中重写父类中的方法:
class Parent:def method(self):print('调用父类的方法')class Child(Parent):def method(self): #此时重写了父类中的method这个方法print('调用子类的方法')c = Child()
c.method()###输出结果为
调用子类的方法
- 类属性与方法:
- 类的私有属性:
- __private_attrs(__weight):两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用方法为:self.__pricate_attrs(self.__weight)
- 类的方法
- 在类的内部,使用def关键字为类定义一个方法,接收的参数第一个参数必须为self(初始化的类本身)
- 类的私有方法
- __method:两个下划线开头,声明该方法只在该类内部使用,还用方法为self.__method
- 类的私有属性:
class Test:__siyou_variable = '私有变量'name = '公开变量'def method(self):print(self.__siyou_variable) #私有变量print(self.name) #公开变量d = Test()
d.method() #初始化类之后,调用类的方法
print(d.name) #直接输出类中的指定属性的属性值
print(d.__siyou_variable) #此时为私有属性,不能直接输出结果,所以会报错####一次输出结果为
私有变量
公开变量公开变量
Traceback (most recent call last):File "test.py", line 16, in <module>print (d.__siyou_variable) # 报错,实例不能访问私有变量
AttributeError: 'Test' object has no attribute '__siyou_variable'
- 类的专有方法:
- __init__:构造函数,在生成对象是调用
- __del__:析构对象,在释放对象时使用
- __repr__:打印,转换
- __setitem__:按照索引赋值
- __getitem__:按照索引取值
- __len__:获得长度
- __cmp__:比较运算
- __call__:函数运算
- __add__:加运算
- __sub__:减运算
- __mul__:乘运算
- __div__:除运算
- __mod__:求余运算
- __pow__:乘方
- 运算符重载
class Vector:def__init__(self, a, b):self.a = aself.b = bdef __str__(self):return 'Vector (%d, %d,)'%(self.a, self.b)def __add__(self):return Vector(self.a + other.a, self.b + other.b)v1 = Vector(2,10) v2 = Vector(5,-2) print(v1 + v2)##输出结果为 Vector(7,8)
python --面向对象相关推荐
- python面向对象的优点_Python面向对象编程——总结面向对象的优点
Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...
- 这可能是Python面向对象编程的最佳实践
作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...
- 第八课.Python面向对象(二)
类的继承和多态 继承和多态与函数有共同的目的,都是为了减少代码的冗余,提高复用的效率: 根据"Python面向对象(一)"的笔记,我现在定义一个Cinema类: #父类 class ...
- Python面向对象编程:类继承和其衍生术语
Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...
- 《Python面向对象编程指南》——1.2 基类中的__init__()方法
本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...
- Python 面向对象 基础
编程范式概述: 面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实 ...
- python面向对象类属性_python面向对象之类属性和类方法案例分析
本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...
- 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结
前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...
- python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!
原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...
- python面向对象编程的优点-Python面向对象编程——总结面向对象的优点
Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...
最新文章
- java 调内存_java内存设置
- 十大经典排序算法之插入排序及其二分优化
- eclipse下拉框里的选项怎么鼠标单击表判断_领导让我预测下一年销量,怎么办?...
- 前端学习(2215):认识react(2)
- 三星电子预计第四季度营业利润为9万亿韩元 低于分析师预期
- C语言中的多字节字符与宽字符
- 安全扫描工具 Netsparker
- 集群语言 Python 入门 脚本工具
- 有哪些好用的游戏加速器推荐?
- 2021年6月程序员薪资出炉,平均薪资15302元
- win7下MeGUI压片无声、卡死、音画不同步、无法转码、无法硬解的解决办法
- 手机怎么把图片转成PDF格式?这个方法很好用
- 互联网广告的形式表现有哪几种?
- RPA---Uipath Try Catch
- Linux系统下操作Oracle数据库
- iphone无线服务器未响应,iphone8无限转圈黑屏强制关机没反应(解决死机黑屏无法开机的3种方式)...
- 程序员好几年才能成为架构师_成为更好的企业架构师
- ThingsBoard使用规则链将设备信息转发至外部mqtt
- gt2怎么与微信连接不上服务器,华为WATCH GT2收不到通知消息怎么办?收不到短信微信消息的解决方...
- 构建告警管理可观察性智能平台