python oop相关

作者: 霡霂976447044 | 来源:发表于2019-02-16 16:29 被阅读15次
  • dir
用于显示内置方法属性 __xxx__
  • del
__del__ 在对象销毁自动调用
  • 继承父类的init以及super
# super是一个类,super()产生一个父类对象
class Father(object):
    def __init__(self):
        print("father init")
class Son(Father):
    def __init__(self):
        pass
son = Son()
# 没有输出任何信息,因为子类覆盖了父类的__init__方法。

class Father(object):
    def __init__(self):
        print("father init")
class Son(Father):
    def __init__(self):
        super().__init__()  # python3
        # Father.__init__(self) python2 不推荐
son = Son()
#基于父类的方法扩展也是使用super
  • 未实现方法警告
 def anther_func(self):
     raise NotImplementedError
# 只能作为警告
  • 继承覆盖父类函数(重写)
class Father(object):
    def say(self):
        print("ba ba")
class Son(Father):
    def say(self):
        print("wa wa")
son = Son()
son.say()
# 输出
# wa wa
# 跟java的一样,子类覆盖父类方法
  • slots 内置属性优化内存
class MyClass(object):
    __slots = ['name', 'identifier']
    def __init__(self, name, identifier):
        self.name = name
        self.identifier = identifier
# 可以减小内存消耗
  • 父类私有方法或者属性
父类中使用 __(双下划线)开头属性或者方法子类即不可访问
  • 子类强制调用父类的私有属性和方法
# 使用 实例._类型__私有名 访问
class A:
    def __init__(self):
        self.name1 = "lisi"
        self.__name2 = "zhangsan"
    def __bar(self):
        print("bar")
class B(A):
    def foo(self):
        print(self._A__name2)
        self._A__bar()
b = B()
b.foo()
  • 多继承
一般的,调用继承列表最近的类的方法 (在MRO查找 ClassType.mro())
  • 新式类和旧式类
python2不写继承object不会默认继承
python3默认不写也会继承自object
  • 静态方法
# 静态方法不访问实例(Dog())属性/方法以及类(Dog)属性/方法
class Animal(object):
    def talk(self):
        raise NotImplementedError
class Dog(Animal):
    def talk(self):
        print("wang wang wang")
    @staticmethod
    def get_dog():
        return Dog()
Dog.get_dog().talk()
  • 类方法 、类属性
#类方法只能访问类属性/方法
class Dog():
    name2 = "lisi" # 类属性
    def __init__(self):
        self.name1 = "zhangsan" # 实例属性
    def talk(self):
        print("wang wang wang")
    @classmethod
    def get_dog(cls): # 类方法
        # print("name %s" % cls.name1) 不能访问实例属性
        print("name %s" % cls.name2)
Dog.get_dog()
  • 实例方法
# 实例方法可以访问类属性、实例属性 访问类属性建议用ClassType访问
class Dog():
    name2 = "lisi"
    list1 = []
    def __init__(self):
        self.name1 = "zhangsan"
    def talk(self):
        print("类属性", self.name2)
        print("id(self.name2):", id(self.name2))
        self.name2 = "zhaoliu"
        self.list1.append("2")
        print("id(self.name2):", id(self.name2))
        print("实例属性", self.name1)
Dog.name2 = "wangwu"
Dog.list1.append("1")
dog1 = Dog()
dog1.talk()
print(Dog.name2)
print(Dog.list1)

输出

类属性 wangwu
id(self.name2): 140533652653872
id(self.name2): 140533652653592
实例属性 zhangsan
wangwu
['1', '2']

不可变的类属性通过self操作改变值不会影响其它实例。

  • python的多态
    在python中 由于是弱语言,体现并不明显

在java中的多态: 父类引用指向子类对象(Father s = new Son(); s.talk()是子类的输出)

class Animal(object):
    def talk(self):
        raise NotImplementedError
class Dog(Animal):
    def talk(self):
        print("wang wang wang")
def play_with_animal(a):
    a.talk()
dog = Dog()
play_with_animal(dog)
  • 单例(只创建一个实例对象)
    预备知识: __new__ 为对象分配空间,返回对象引用
class MusicPlayer(object):
    instance = None
    init_flag = False
    def __init__(self):
        if MusicPlayer.init_flag:
            return
        print("MusicPlayer init...")
        MusicPlayer.init_flag = True
    def __new__(cls, *args, **kwargs):
        print("new called")
        if not cls.instance:
            cls.instance = super().__new__(cls)  # 必须
        return cls.instance
    def play(self):
        print("playing music...")
player = MusicPlayer()
print(player)
player = MusicPlayer()
print(player)
  • super关键字

super在使用中使用出错会造成父类,不正确的初始化。

Son(Father1, Father2) > super(Father1, self).init() 表示从Son.mro元组里面查找到Father1, 执行之后的init方法。请理解并执行下面的程序。

class Father(object):
    def __init__(self):
        print("Father called")
class Father1(Father):
    def __init__(self):
        # (<class '__main__.Son'>, <class '__main__.Father1'>, <class '__main__.Father2'>, <class '__main__.Father'>, <class 'object'>)
        print("Father1 init start")
        super(Father, self).__init__()  # 执行Father后面的object的__init__
        print("Father1 init over")
class Father2(Father):
    def __init__(self):
        print("Father2 init start")
        super(Father2, self).__init__() # 执行Father2后面的father的__init__
        print("Father2 init over")
class Son(Father1, Father2):
    def __init__(self):
        print("Son init start")
        # (<class '__main__.Son'>, <class '__main__.Father1'>, <class '__main__.Father2'>, <class '__main__.Father'>, <class 'object'>)
        # super(Father2, self).__init__()  # 执行Father2后面的Father对象的__init__
        # super(Father1, self).__init__()   # 执行Father1后面的Father2对象的__init__
        super(Son, self).__init__() # 同下
        # super().__init__() # 同上
        print("Son init over")
print(Son.__mro__)
son = Son()

每次调用super(ClassType)函数都是执行MRO列表的ClassType的下一个类型的方法
避免子类没有正确继承初始化,每一个类都应该写为super(ClassType,self).xxx 或者super().xxx

  • __class__
__class__ 获取的结果一般和type(Object)结果一样。
eg:   self.__classs__.__name__ 

相关文章

  • python oop相关

    dir del 继承父类的init以及super 未实现方法警告 继承覆盖父类函数(重写) slots 内置属性优...

  • Python OOP

    断断续续写了几年程序,终于接触到面向对象的编程方式。本文记录与以往编程体验不同的地方 数据和逻辑被封装: 1. 操...

  • Python OOP

    面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分...

  • 对象 原型

    1- 关于 OOP 及其相关特性 OOP: Object Oriented Programming,面向对象的程...

  • Python学习总结

    Python概述 数据类型 数据结构 OOP FP

  • python面向对象学习笔记-01

    学习笔记 # 0,OOP-Python面向对象 - Python的面向对象 - 面向对象编程 - 基础 -...

  • python面向对象程序设计(OOP)

    python面向对象程序设计(OOP) 类定义语法class className: 在python中可以...

  • 2018-04-14 开胃学习Python系列 - Object

    Python也是oop,虽然函数在Python生态系统中扮演重要角色。Python确实具有类别(classes) ...

  • python 类的细节

    下面我根据MARK Lutz的《Learning Python》中的“大师眼中的OOP”,列一些使用OOP的常见原...

  • python - OOP进阶

    前言 python的class有很多高级特性,除了OOP的三大特性,还在设计模式,自定制类和内存优化等都下了很多功...

网友评论

    本文标题:python oop相关

    本文链接:https://www.haomeiwen.com/subject/kqfieqtx.html