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生成毫秒时间戳的例子
php时间函数time()生成当前时间的秒数,但是在一些情况下我们需要获取当前服务器时间和GMT(格林威治时间)1970年1月0时0分0秒的毫秒数,与Java中的currentTimeMilis()函 ...
- UE4 Notes
Unreal Engine 4 减少编辑器的帧率C:\Program Files\Epic Games\UE_4.19\Engine\Config\BaseEngine.ini[/Script/Unr ...
- QLabel设置文字大小和颜色
https://blog.csdn.net/fm0517/article/details/4805462 ui.label是QLabel ui.label_4->setText("so ...
- 机器学习&深度学习基础(tensorflow版本实现的算法概述0)
tensorflow集成和实现了各种机器学习基础的算法,可以直接调用. 代码集:https://github.com/ageron/handson-ml 监督学习 1)决策树(Decision Tre ...
- 【2019年04月03日】A股最便宜的股票
太钢不锈(SZ000825) - 当前便宜指数:161.66 - 滚动扣非市盈率PE:4.62 - 滚动市净率PB:1.03 - 动态年化股息收益率:4.53% - 太钢不锈(SZ000825)的历史 ...
- SpringBoot------异步任务的使用
步骤,如图所示: 1.添加异步任务业务类 package top.ytheng.demo.task; import java.util.concurrent.Future; import org.sp ...
- MySql 查询银行卡号打码
),")) end as card_number from das.staff_base; case 函数 CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THE ...
- 【Postgres】空间数据库创建
1.数据库创建问题-Navicat-ERROR: source database "template1" is being accessed by other users 2.解决 ...
- VS每次F5都重新编译代码,即使没有任何修改
遇到一个奇怪现象,不知道怎么设置了,突然工程的Release模式下,F5每次都要重新编译代码,而且是全部代码都重新编译 而Debug模式没问题 重启VS,重启机器,清理工程重新生成工程都无法解决 最后 ...
- sqlserver等软件下载
http://msdn.itellyou.cn/ 找到所需要的,复制下载路径,到迅雷下载