类的定义和使用

 #
 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. 两台linux服务器各有两个不同的用户 其中一个服务器可以无密码登录服务器

    服务器A:普通用户USERA 服务器B:普通用户USERB 把USERA的公钥写入服务器B用户USERB的authorized_keys中 USERA能普能用户登录然后服务器A,然后再登录服务器B: ...

  2. 如何保持github的fork于主干同步

    step1: https://help.github.com/articles/configuring-a-remote-for-a-fork/ step2: https://help.github. ...

  3. SQL Server 各种时间业务处理

    1.SQL 生成随机字符串作为流水号 ), ) --年月日时分秒 ), ),'-','') ), ),':','') --随机英文字符 ))),) ) --英文加数字 随机五位数字 )))) ))), ...

  4. ShiftRows方法简介

    ShiftRows 是HSSFSheet工作薄的方法 ShiftRows(int startRow,int endRow,int n)参数介绍:startRow:开始行endRow:末尾行n:移动n行 ...

  5. Xcode 常用代码段

    weak_shortcut /** <#注释#> */ @property(nonatomic,weak) <#class#> *<#name#>; copy_sh ...

  6. hdoj:2049

    #include <iostream> using namespace std; ]; /* n 个 数中 m个错排 转化为:充n个数中选取m个数,共有C(n,m)中,选取的m个数进行全部 ...

  7. 运行yarn的时候提示 node不是内部或外部命令

    背景:准备react native 搭建,装完nodejs  npm 重启cmd,再次管理员运行即可!

  8. git踩过的坑

    一.git 解决fatal: Not a git repository 我用git add file添加文件时出现这样错误: fatal: Not a git repository (or any o ...

  9. 【转】WPF Template模版之DataTemplate与ControlTemplate的关系和应用(二)

    1. DataTemplate和ControlTemplate的关系 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是数据的行为和载体,是个抽象的概念,至于它 ...

  10. Java开发面试题汇总整理

    又是金三银四的时候,我希望这份面试题能够祝你一臂之力! 自我和项目相关 1.自我介绍 2.你觉得自己的优点是?你觉得自己有啥缺点? 3.你有哪些 offer? 4.你为什么要离开上家公司?你上家公司在 ...