类的定义和使用

 #
 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. git忽略.idan目录

    git rm -r --cached .idea git add . git commit -m '忽略idea' git pull git push

  2. U-BOOT2016.05 配置内存大小

    bootargs 里面有一个 mem 的参数,将这个配置 512M 便是将内存配置为 512M

  3. 解决SVN 每次操作都需要重输入用户名密码问题

    把目录C:\Users\当前账号\AppData\Roaming\Subversion\auth下的文件删除,然后重启hbuilder或eclipse工具,重新输入账号密码之后,保存即可解决该问题.

  4. mysql like 查不到结果 中文 查询优化

    [参考]mysql like %keyword%不走索引替代方法 在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万 ...

  5. react文档demo实现输入展示搜索结果列表

    文档页面地址:https://doc.react-china.org/docs/thinking-in-react.html 该文档只给了具体实现思路,下面是我实现的代码. 初学react,如果有写的 ...

  6. 使用PgBouncer连接池

    1.pgbouncer 的介绍 pgbouncer是一个针对PostgreSQL数据库的轻量级连接池,任何目标应用都可以把 pgbouncer 当作一个 PostgreSQL/Greenplum 服务 ...

  7. CF 1131C Birthday

    C. Birthday time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  8. Linux下的awk文本分析命令实例(二)

    awk实现求和.平均.最大值和最小值的计算操作 准备和数据文件 [finance@master2-dev ~]$ cat data.txt 求和 [finance@master2-dev ~]$ ca ...

  9. linux基础操作1

    date #查看日期cal #查看当月日历cal 2017 #查看某年全年的日历whoami #查看当前登录的用户 #修改网卡,可以上网的步骤vi /etc/sysconfig/network-scr ...

  10. mysql sql注入getshell新姿势

     sql.php?sql=1'报错信息为:1064:You have an error in your SQL syntax; check the manual that corresponds to ...