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程序 面向对象高级语法部分 经典 ...
随机推荐
- webpack打包css
1.第一种方式 1.安装css-loader和style-loader $ cnpm install css-loader style-loader --save-dev 2.引用的时候使用css-l ...
- XML格式化工具
做接口开发的时候,往往接受参数或返回值是一个XML的字符串.如下图,不方便辨识 两种方法, 1.将它保存为xxx.xml,然后用浏览器打开.这种方法稍微有些麻烦. 2.使用 UltraEdit 工具
- Linux文件属性有哪些?(共十位)
-rw-r--r-- 那个是权限符号,总共是 - --- --- --- 这几个位. 第一个短横处是文件类型识别符: - 表示普通文件: c 表示字符设备(character): b 表示块设备(bl ...
- windows保存的文件传输到linux中格式转换
直接从window传输到linux的脚本执行时,会出现以下错误. -bash: xxx: /bin/sh^M: bad interpreter: No such file or directory 解 ...
- Git命令速查表
- Android 8 设置蓝牙名称 流程
记录android 8设置蓝牙名称的流程. packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothDeviceRenam ...
- C# 正则表达式判断是否是数字、是否含有中文、是否是数字字母组合
//判断输入是否包含中文 不管你有没有输入英文,只要包含中文,就返回 true public static bool HasChinese(string content) { //判断是不是中文 st ...
- Android打开各种类型的文件方法总结
很简单,通过调用系统的intent,我们可以打开各种文件,不熟悉的朋友可以了解下action.datatype.uri的相关知识. 通用方法如下: public static Intent openF ...
- 我的订单页面List
<%@ page language="java" contentType="text/html;charset=UTF-8"%> <%@ ta ...
- 【netcore基础】ConcurrentDictionary 使用字符串作为key给代码加锁且使用EF事物防止并发调用数据混乱的问题
业务场景需要锁住指定的字符串下的代码,防止并发创建多个订单 这里我们使用 ConcurrentDictionary 首先初始化一个字典 private static readonly Concurre ...