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程序 面向对象高级语法部分 经典 ...
随机推荐
- oracle表查询优化
ORACLE有个高速缓冲的概念,这个高速缓冲就是存放执行过的SQL语句,那oracle在执行sql语句的时候要做很多工作,例如解析sql语句,估算索引利用率,绑定变量,读取数据块等等这些操作.假设高速 ...
- springboot-thymeleaf
Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: Thymeleaf 在有网络和无网络 ...
- ubuntu14.04安装MATLAB R2017b步骤详解
转载:https://blog.csdn.net/qq_32892383/article/details/79670871 1. 前言最近由于项目原因,需要在ubuntu上安装MATLAB,在网上找了 ...
- sprintf的Bug
]; sprintf(buffer,,,); 这样一般不崩溃,但是10次,有那么一次会崩溃 我只能说后面改成 0.0就可以了...
- YARN 启动后失败退出——没有请求资源——Invalid resource request, no resources request
在ambari-server中修改了yarn的配置,重新启动服务,结果RM启动失败,错误也很奇怪,“不合理的资源请求,没有请求任何资源”!详细如下: -- ::, FATAL resourcemana ...
- windows安装mongodb服务简洁版教程
根据网上安装教程,简单总结如下: 1.去mongodb官网下载电脑系统对应版本的软件,比如我的是windows 64位的,就选择64位的,可能下载下来之后文件夹上面显示的是win32,这个不用理会: ...
- BarTender安装常见问题集结
很多人在安装BarTender时,会出现各种安装程序信息警告提示,导致软件无法继续安装下去,那么针对这些Bartender安装问题我们要怎么正确解决呢?下面,小编将BarTender安装失败常见问题, ...
- excel函数vloopup使用方法
邮件处理,查找null手机号码 G1=VLOOKUP(F1,A:B,2,FALSE) H1=VLOOKUP(F1,A:F,7,FALSE)参数1是:查找列,参数2是:范围,参数3是:查找的 ...
- Solve Error: Library not loaded: @rpath/RoutingHTTPServer.framework/RoutingHTTPServer
在配置WebDriverAgent的时候,可能会遇到如下的错误: 2018-01-04 09:53:42.759370-0600 WebDriverAgentRunner-Runner[318:133 ...
- react material-ui 添加jss插件
jss.config.js import { create } from "jss"; import preset from "jss-preset-default&qu ...