类的定义和使用

 #
 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. 【Java】设计模型-五种单例模型

    一. 什么是单例模式 只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在. 单例模式有很多好处,它能够 ...

  2. Hadoop:hdfs文件permission denied问题解析

    Cron jobs can be scheduled, but fail to write parquet file and seems due to user permission of “yarn ...

  3. android9.0适配HTTPS:not permitted by network security policy'

    app功能接口正常,其他手机运行OK,但是在Android9.0的手机上报错 CLEARTEXT communication to 192.168.1.xx not permitted by netw ...

  4. Centos7 yum安装tomcat

    以下操作是在线安装apache-tomcat 需要联网下载包. liux系统环境 [root@localhost ~]# cat /etc/redhat-release CentOS Linux re ...

  5. 安装Conda并在Conda下安装jupyter notebook

    1:安装 conda install jupyter notebook 2:启动 jupyter notebook

  6. Oracle 11G 安装文档

    一. 将文件win32_11gR2_database_1of2.zip和win32_11gR2_database_2of2.zip解压. 注意:这两个文件解压到同一个目录下,即:将Components ...

  7. BCP文件导入SQLServer数据库遇到的问题

    1. BCP文件插入sql server数据库,未指定数据库字段类型情况下,需要每个字段单独指定字段长度 2.文件中的存储值得类型 3.设置最大的类型

  8. 转载:sigmoid和softmax总结

    转自:http://blog.csdn.net/u014422406/article/details/52805924 sigmoid函数(也叫逻辑斯谛函数): 引用wiki百科的定义: A logi ...

  9. VBA 全局常量定义

    Public Const INDEX As Integer = 16 Public Const RESULT_SHEET As String = "result" Public C ...

  10. 通俗讲解:PoW共识机制与以太坊的关系、Ghost协议 及 PoS共识机制的变种---Casper

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...