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程序 面向对象高级语法部分 经典 ...
随机推荐
- git忽略.idan目录
git rm -r --cached .idea git add . git commit -m '忽略idea' git pull git push
- U-BOOT2016.05 配置内存大小
bootargs 里面有一个 mem 的参数,将这个配置 512M 便是将内存配置为 512M
- 解决SVN 每次操作都需要重输入用户名密码问题
把目录C:\Users\当前账号\AppData\Roaming\Subversion\auth下的文件删除,然后重启hbuilder或eclipse工具,重新输入账号密码之后,保存即可解决该问题.
- mysql like 查不到结果 中文 查询优化
[参考]mysql like %keyword%不走索引替代方法 在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万 ...
- react文档demo实现输入展示搜索结果列表
文档页面地址:https://doc.react-china.org/docs/thinking-in-react.html 该文档只给了具体实现思路,下面是我实现的代码. 初学react,如果有写的 ...
- 使用PgBouncer连接池
1.pgbouncer 的介绍 pgbouncer是一个针对PostgreSQL数据库的轻量级连接池,任何目标应用都可以把 pgbouncer 当作一个 PostgreSQL/Greenplum 服务 ...
- CF 1131C Birthday
C. Birthday time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- Linux下的awk文本分析命令实例(二)
awk实现求和.平均.最大值和最小值的计算操作 准备和数据文件 [finance@master2-dev ~]$ cat data.txt 求和 [finance@master2-dev ~]$ ca ...
- linux基础操作1
date #查看日期cal #查看当月日历cal 2017 #查看某年全年的日历whoami #查看当前登录的用户 #修改网卡,可以上网的步骤vi /etc/sysconfig/network-scr ...
- mysql sql注入getshell新姿势
sql.php?sql=1'报错信息为:1064:You have an error in your SQL syntax; check the manual that corresponds to ...