python基础(13)-面向对象
类
类的定义和使用
# class Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def show(self): print(self.name) # 实例化 person1 = Person('张三', 18, '男') person2 = Person('李四', 20, '女') person1.show() # 张三 person2.show() # 李四
类方法和静态方法
class A: @classmethod def print1(self): print('print in class method') @staticmethod def print2(): print('print in static method') A.print1() # print in class method A.print2() # print in static method
接口和抽象类
由于python 没有抽象类、接口的概念,所以要实现这种功能得abc.py 这个类库,具体方式如下
接口
所有方法都必须在子类中实现
import abc class AInterface(metaclass=abc.ABCMeta): @abc.abstractmethod def func1(self): pass class A(AInterface): def func1(self): pass a = A() # 不实现则报错 # TypeError: Can't instantiate abstract class A with abstract methods func1
抽象类
部分方法在子类中实现
import abc class AInterface(metaclass=abc.ABCMeta): @abc.abstractmethod def func1(self): pass def func2(self): pass class A(AInterface): def func1(self): pass a = A() a.func2() # 不实现则报错 # TypeError: Can't instantiate abstract class A with abstract methods func1
三大特性
继承
单继承
class A: def print(self): print("print from A") # B继承A class B(A): pass # C继承A class C(A): def print(self): print('print from C') b = B() b.print() # print from A c = C() c.print() # print from C
当调用的方法在父类中已经存在同名方法,会默认调用子类的方法.如C类.如果子类中没有,则会调用父类的方法,如B类.
多继承
class A: def print(self): print('print from A') class B: def print(self): print('print from B') class C1(A, B): pass class C2(B, A): pass # C1类继承A类B类 C2类继承B类和A类 c1 = C1() c1.print() # print from A c2 = C2() c2.print() # print from B
一个类继承多个类时,当调用的方法子类中没有时,会按继承顺序(从左到右)依次在父类中寻找并调用
派生
子类拥有父类没有的方法或属性
class A: def print(self): print('print from A') class B(A): def myprint(self): print('print from B') b = B() b.print() # print from A b.myprint() # print from B
钻石继承(super()的执行顺序)
class A: def print(self): print("print from A") # print from A 5 class B(A): def print(self): print('print from B') # print from B 1 print(super().print) # <bound method C.print of <__main__.D object at 0x00000000021EC6D8>> 2 super().print() class C(A): def print(self): print('print from C') # print from C 3 print(super().print) # <bound method A.print of <__main__.D object at 0x00000000021EC6D8>> 4 super().print() class D(B, C): pass d = D() d.print() # result: # print from B # <bound method C.print of <__main__.D object at 0x00000000021EC6D8>> # print from C # <bound method A.print of <__main__.D object at 0x00000000021EC6D8>> # print from A
多态
python原生支持多态
java中的多态
public interface Animal { void talk(); } public class Dog implements Animal{ @Override public void talk() { System.out.println("wangwang"); } } public class Pig implements Animal { @Override public void talk() { System.out.println("aoao"); } } public class Main { public static void main(String[] args) { Animal dog = new Dog(); dog.talk(); Animal pig = new Pig(); pig.talk(); } }
python中的多态
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def talk(self): pass class Pig(Animal): def talk(self): print('aoao') class Dog(Animal): def talk(self): print('wangwang') dog = Dog() dog.talk() pig = Pig() pig.talk()
封装
私有属性
属性\方法名前加双下划线声明私有属性\方法.对应java中private,默认public,无protect.(*在类的外部仍然可以通过实例._类名__属性名调用)
class Person: def __init__(self, name, age, gender, pwd): self.name = name self.__age = age self.gender = gender self.pwd = pwd def __getpwd(self): return self.pwd person = Person(') print(person.name) # print(person.__age) # AttributeError: 'Person' object has no attribute '__age' print(person.__getpwd()) # AttributeError: 'Person' object has no attribute '__getpwd'
封装属性
@property可以将方法封装成属性
class Person: def __init__(self, name, age): self.__name = name self.__age = age @property def name(self): return self.__name @name.setter def name(self, new_name): self.__name = new_name @name.deleter def name(self): print('执行删除name操作') p = Person('张三', 18) print(p.name) # 张三 p.name = '李四' print(p.name) # 李四 # 只是触发对应deleter装饰的函数,具体操作需在函数类完成 del p.name # 执行删除name操作 print(p.name) # 李四
python基础(13)-面向对象的更多相关文章
- 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 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- Python基础7 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...
随机推荐
- php项目踩到的empty函数的一个坑
报错信息: PHP Fatal error: Can't use function return value in write context in /目录省略.../XXService.php on ...
- netstat实现原理
因为最近接手的项目是基于嵌入式Linux openwrt的,一开始以为会跟之前的服务器开发没什么大的区别,但是遇到问题去分析的时候才发现,工具链还是有些差别的,openwrt的netstat是属于一个 ...
- 【iCore1S 双核心板_ARM】例程十六:USB_MSC实验——虚拟U盘
实验步骤: 1.将SD卡插在SD卡槽中. 2.将跳线冒跳至USB_Device,将USB_Device通过Micor USB线与USB主机(电脑)相连. 3.烧写程序,我的电脑中将出现一个磁盘. 实验 ...
- 一个tomcat服务器上部署多个Web项目,不同域名访问
[参考]一个tomcat服务器上部署多个项目,不同域名访问 我们一个服务器只按装了一个tomcat服务器,现在有多个项目或者多个域名访问,下面来进行配置 在这里我们只需要修改conf下的server. ...
- MyBatis总结五:#{}和${}的用法和区别
From: https://www.cnblogs.com/blazeZzz/p/9295634.html #{}的用法: 我们发现,在Mapper.xml映射文件中,经常使用#{属性名} 来作为SQ ...
- 使用100%面向过程的思维方式来写java程序
1.java是强制写class关键字的语言,不能有独立的函数游离在类外出现在文件中,这和python c++ 都不同,后面的都可以单独在类外写函数,所以java被称为是纯面向对象的语言,py和c++都 ...
- python中基本类型的连接组合和互相转换
本篇总结了一下字符串,列表,字典,元组的连接组合使用和类型的互相转换小例子,尤其列表中的extend()方法和字典中的 update方法非常的常用. 1.连接两个字符串 a = "hello ...
- Qt编写自定义控件9-导航按钮控件
前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2 ...
- C# 求俩个正整数的最小公倍数和最大公约数
C# 求俩个正整数的最小公倍数和最大公约数 1.公倍数.最小公倍数 两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数 翻开小学5年级下册PPT 1.1 ...
- solr搜索分词优化
solr服务器配置好在搜索时经常会搜出无关内容,把不该分的词给分了,导致客户找不到自己需要的内容,那么我们就从配置词典入手解决这个问题. 首先需要知道自带的词典含义: 停止词:停止词是无功能意义的词, ...