Python基础—12-面向对象(02)
面向对象
面向对象三大特点
- 封装:既可对数据结构进行封装,又可对处理数据的方法进行封装
- 继承:强调的父子类的关系
- 多态:不同对象调用相同的方法,会有不同的响应
类的继承
相关概念
- 继承:父类的属性和方法,子类直接拥有,称为继承
- 派生:子类在父类的基础上衍生出新的特征(属性和行为)
- 总结:其实他们是一回事,只是描述问题的侧重点不同(继承强调相同点,派生强调不同点)
继承语法
# class Animal(object):
# 当没有指定父类时,默认继承object
class Animal:
def __init__(self, name):
self.name = name def eat(self):
print('小动物喜欢一天到晚出个不停') # 继承自Animal
class Dog(Animal):
pass d = Dog('旺财')
# 可以拥有父类的方法
d.eat()
# 也可以拥有父类的属性
print(d.name)派生示例
class Animal:
def run(self):
print('小动物喜欢成天跑个不停') class Cat(Animal):
def eat(self):
print('猫喜欢吃老鼠') tom = Cat() tom.run()
# 多出来的行为
tom.eat() # 多出来的属性
tom.color = '蓝色'
print(tom.color)重写方法
- 若父类的方法完全不合适,可以进行覆盖重写
- 若父类的方法不够完善,可以添枝加叶进行完善
- 示例:
class Animal:
def eat(self):
print('小动物一天到晚的出个不停') def run(self):
print('小动物一天到晚的四处连跑') class Cat(Animal):
# 父类的方法完全不合适,覆盖重写
def run(self):
print('俺走的是猫步') # 父类的方法部分合适,需要添加内容进行完善
def eat(self):
# 保留父类的内容,不建议使用此方式
# Animal.eat(self)
# super(Cat, self).eat()
# 类名及self可以不传
super().eat()
print('不过俺喜欢吃鱼') jiafei = Cat()
jiafei.run()
jiafei.eat()多继承:一个子类可以拥有多个父类
class A:
def eat(self):
print('eat func in class A') class B:
def eat(self):
print('eat func in class B') class C(A, B):
def eat(self):
# 这种方案是默认的继承顺序进行选择的父类方法
# super().eat()
# 人为指定调用某个父类的方法
B.eat(self) c = C()
c.eat()
访问权限
权限
- 公有的:类中的普通的属性和方法,默认都是公有的;可以在类内、类外、子类中使用
- 私有的:定义时在前面添加两个'_',就变成了私有的;只能在类内使用,不能在类外及子类中使用
示例:
class Person:
def __init__(self, name):
self.name = name
self.__age = 20 def eat(self):
print('民以食为天') def __test(self):
print('__test') xiaoming = Person('小明')
print(xiaoming.name)
xiaoming.eat()
# 不能在类外使用
print(xiaoming.__age)
xiaoming._Person__test()
print(xiaoming.dict)
# 尽管可以这样访问私有属性,但是强烈建议不要这样使用
print(xiaoming._Person__age) class Man(Person):
def introduce(self):
# 不能在子类中使用
# print(self.__age)
print('我叫{}'.format(self.name))
self.eat() m = Man('诸葛')
m.introduce()
类属性
说明:定义类时,写在方法外的属性,通常会写在类的开头,这样的属性称为类属性
示例:
class Person:
# 类属性,通过类名访问,属于整个类,而不是某个对象
# nation = '中国' # 限制可以使用的属性,提高访问的效率
# 也可以提高访问速度,减少内存使用
__slots__ = ('name', 'age', 'nation') def __init__(self, name):
self.name = name
self.nation = 'china' p1 = Person('小明')
p2 = Person('小红')
print(p1.name, p2.name)
print(Person.nation)
# p1.nation = 'china'
print(p1.nation)
print(p2.nation)
# print(Person.nation) p1.age = 20
# p1.height = 180 # 特殊的类属性
# 表示类名的字符串
print(Person.__name__) # 表示父类构成的元组
print(Person.__bases__) # 存储类的相关信息
print(Person.__dict__) # 限制可以使用的属性
print(Person.__slots__)
类方法
说明:
- 定义时使用
classmethod装饰器装饰的方法 - 使用时通过类名调用
- 定义时使用
作用:
- 可以创建对象或者简洁的创建对象
- 对外提供简单易用的接口
示例1:创建对象
class Person:
def eat(self):
print('我喜欢吃麻辣烫,不要麻椒和辣椒') @classmethod
def test(cls):
print(cls)
print('类方法') # 创建对象,或者简洁的创建对象
@classmethod
def create(cls):
p = cls()
p.age = 1
return p p1 = Person()
p1.eat() # 通过类名调用
Person.test()
# 创建或简洁的创建对象
p2 = Person.create()
print(type(p2))
示例2:提供接口
class Number:
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2 def add(self):
return self.num1 + self.num2 def sub(self):
return self.num1 - self.num2 def mul(self):
return self.num1 * self.num2 def div(self):
if self.num2 == 0:
return None
return self.num1 / self.num2 # 对外提供简单易用的接口
@classmethod
def pingfanghe(cls, num1, num2):
n1 = cls(num1, num1)
n12 = n1.mul() n2 = cls(num2, num2)
n22 = n2.mul() n3 = cls(n12, n22)
return n3.add() he = Number.pingfanghe(3, 4)
print(he)
静态方法
说明:
- 使用
staticmethod装饰器装饰的方法(方法没有cls参数) - 通过类名进行调用
- 使用
示例:
class Person:
@staticmethod
def test():
print('static method test') # 创建对象
@staticmethod
def create():
p = Person()
return p Person.test()
p = Person.create()
print(p)
总结:
- 凡是静态方法完成的功能都可以是类方法完成
- 若方法中没有使用到类名(cls),可以使用静态方法
多态特性
定义:不同的对象,调用相同的方法,有不同的响应,称为多态
示例:
class Animal:
def run(self):
pass class Dog(Animal):
def run(self):
print('狗通常走S型') class Cat(Animal):
def run(self):
print('猫平时走猫步,偶尔突然加速') def test(obj):
obj.run() d = Dog()
c = Cat()
test(d)
test(c)
属性函数
说明:将成员方法当做属性一样进行访问
作用:保护特定属性,或者对特定属性进行处理
示例:
class User:
def __init__(self, username, password):
self.username = username
self.__password = password # 该方法可以像成员属性一样访问
@property
def password(self):
print('有人想查看密码')
return '想偷看密码,没门'
# return self.__password # 在设置密码时,会自动调用
@password.setter
def password(self, password):
print('@password.setter', password)
self.__password = '加密' + password + '加密' u = User('xiaoming', '')
# print(u.password())
print(u.password) # 设置密码,会自动调用setter方法
u.password = 'abcde'
Python基础—12-面向对象(02)的更多相关文章
- python基础之面向对象02
---继承 当我们定义完成某个类时,可以再定义一个新类,新类可以继承第一个类.新类被称为子类,而被继承的类称为父类/基类/超类. 继承就是子类继承父类的属性和方法(注意是类属性和类方法). 继承可以使 ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- [.net 面向对象编程基础] (12) 面向对象三大特性——继承
[.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- 十二. Python基础(12)--生成器
十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...
- 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)
# 『Python基础-12』各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
随机推荐
- 使用mermain用Markdown的语法画流程图和UML图
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用mermain用Markdown的语法画流程图和UML图.
- dubbo-admin网页管理控制台
由于近段时间在看dubbo,网上找到的这个war包发布到tomcat报错,故从git(https://github.com/apache/incubator-dubbo-ops)上重新下载编译了版本 ...
- Visual Paradigm for UML 10.0 SP1 企业中文下载地址、安装及激活详解教程
https://blog.csdn.net/u013354805/article/details/46531833
- JS基础学习——对象
JS基础学习--对象 什么是对象 对象object是JS的一种基本数据类型,除此之外还包括的基本数据类型有string.number.boolean.null.undefined.与其他数据类型不同的 ...
- html学习笔记:基本结构,排列清单,表格
<html> <head> 基本结构,排列清单,表格 <title></title> <!--文件标题声明--> <base> ...
- 基于ArcGIS的CAD数据向GIS数据转换方法(转)
基于ArcGIS的CAD数据向GIS数据转换方法 1 CAD数据与ArcGIS数据介绍 地图数据来源多种多样,大多数使用的是计算机辅助设计软件(CAD)制作的数据,CAD软件制图自动化程度高,操作简单 ...
- arcgis C#判断点在线段的左右侧
要判断一个点在一条线段的左侧还是右侧,从网上查到了这样一个算法.其实本质上就是一个sin角度的计算问题. 设线段端点为从A(x1,y1)到B(x2,y2),线外一点P(x0,y0),判断该点位于有向线 ...
- linux注册服务教程
该说明是项目完成很久之后,整理资料时的偶然发现,当时所操作的linux为中标麒麟,需要对项目进行开机自启,对llinux还不熟悉,找不到linux中的服务自启设置.辗转多次才找到了解决方案.记录以供参 ...
- Oracle 数据库异机恢复(归档模式)
操作必须在服务器上进行(在192.168.12.71上执行) 0.按需要恢复的日期,把距恢复日期最近的全部备份和全部备份日期后的日志备份一同拷贝到需要恢复的机器上: 1.用RMAN登陆 C:\User ...
- CSS布局中的问题解决方式
1.解决搜索框和按钮不对齐的方法 vertical-align属性只有两个元素设置为display:inline-block才有效 2.盒子莫名的分行现象 问题描述:比如父盒子宽度为960px,两个左 ...