类的定义和使用

 #
 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项目踩到的empty函数的一个坑

    报错信息: PHP Fatal error: Can't use function return value in write context in /目录省略.../XXService.php on ...

  2. netstat实现原理

    因为最近接手的项目是基于嵌入式Linux openwrt的,一开始以为会跟之前的服务器开发没什么大的区别,但是遇到问题去分析的时候才发现,工具链还是有些差别的,openwrt的netstat是属于一个 ...

  3. 【iCore1S 双核心板_ARM】例程十六:USB_MSC实验——虚拟U盘

    实验步骤: 1.将SD卡插在SD卡槽中. 2.将跳线冒跳至USB_Device,将USB_Device通过Micor USB线与USB主机(电脑)相连. 3.烧写程序,我的电脑中将出现一个磁盘. 实验 ...

  4. 一个tomcat服务器上部署多个Web项目,不同域名访问

    [参考]一个tomcat服务器上部署多个项目,不同域名访问 我们一个服务器只按装了一个tomcat服务器,现在有多个项目或者多个域名访问,下面来进行配置 在这里我们只需要修改conf下的server. ...

  5. MyBatis总结五:#{}和${}的用法和区别

    From: https://www.cnblogs.com/blazeZzz/p/9295634.html #{}的用法: 我们发现,在Mapper.xml映射文件中,经常使用#{属性名} 来作为SQ ...

  6. 使用100%面向过程的思维方式来写java程序

    1.java是强制写class关键字的语言,不能有独立的函数游离在类外出现在文件中,这和python c++ 都不同,后面的都可以单独在类外写函数,所以java被称为是纯面向对象的语言,py和c++都 ...

  7. python中基本类型的连接组合和互相转换

    本篇总结了一下字符串,列表,字典,元组的连接组合使用和类型的互相转换小例子,尤其列表中的extend()方法和字典中的 update方法非常的常用. 1.连接两个字符串 a = "hello ...

  8. Qt编写自定义控件9-导航按钮控件

    前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2 ...

  9. C# 求俩个正整数的最小公倍数和最大公约数

    C# 求俩个正整数的最小公倍数和最大公约数 1.公倍数.最小公倍数 两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数 翻开小学5年级下册PPT 1.1 ...

  10. solr搜索分词优化

    solr服务器配置好在搜索时经常会搜出无关内容,把不该分的词给分了,导致客户找不到自己需要的内容,那么我们就从配置词典入手解决这个问题. 首先需要知道自带的词典含义: 停止词:停止词是无功能意义的词, ...