类的定义和使用

 #
 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)-面向对象的更多相关文章

  1. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  2. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  3. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  4. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  5. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  6. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  7. 十三. Python基础(13)--生成器进阶

    十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...

  8. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  9. Python基础7 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...

随机推荐

  1. php生成毫秒时间戳的例子

    php时间函数time()生成当前时间的秒数,但是在一些情况下我们需要获取当前服务器时间和GMT(格林威治时间)1970年1月0时0分0秒的毫秒数,与Java中的currentTimeMilis()函 ...

  2. UE4 Notes

    Unreal Engine 4 减少编辑器的帧率C:\Program Files\Epic Games\UE_4.19\Engine\Config\BaseEngine.ini[/Script/Unr ...

  3. QLabel设置文字大小和颜色

    https://blog.csdn.net/fm0517/article/details/4805462 ui.label是QLabel ui.label_4->setText("so ...

  4. 机器学习&深度学习基础(tensorflow版本实现的算法概述0)

    tensorflow集成和实现了各种机器学习基础的算法,可以直接调用. 代码集:https://github.com/ageron/handson-ml 监督学习 1)决策树(Decision Tre ...

  5. 【2019年04月03日】A股最便宜的股票

    太钢不锈(SZ000825) - 当前便宜指数:161.66 - 滚动扣非市盈率PE:4.62 - 滚动市净率PB:1.03 - 动态年化股息收益率:4.53% - 太钢不锈(SZ000825)的历史 ...

  6. SpringBoot------异步任务的使用

    步骤,如图所示: 1.添加异步任务业务类 package top.ytheng.demo.task; import java.util.concurrent.Future; import org.sp ...

  7. MySql 查询银行卡号打码

    ),")) end as card_number from das.staff_base; case 函数 CASE    WHEN 条件1 THEN 结果1    WHEN 条件2 THE ...

  8. 【Postgres】空间数据库创建

    1.数据库创建问题-Navicat-ERROR: source database "template1" is being accessed by other users 2.解决 ...

  9. VS每次F5都重新编译代码,即使没有任何修改

    遇到一个奇怪现象,不知道怎么设置了,突然工程的Release模式下,F5每次都要重新编译代码,而且是全部代码都重新编译 而Debug模式没问题 重启VS,重启机器,清理工程重新生成工程都无法解决 最后 ...

  10. sqlserver等软件下载

    http://msdn.itellyou.cn/ 找到所需要的,复制下载路径,到迅雷下载