Python OOP总结

面试的时候被问到几次python的OOP都挂了,决定认真的学一遍~~

python的面向对象的设计和c++等编译语言不同,主要注意的是:

  1. python的类没有访问权限的问题,也就是说所有的变量都是可访问的。
    实际上python有私有的机制,就是在属性前加__,但是这种私有机制实际上也是伪私有,因为它其实是用一个别名来保存这个属性。
    例如在类A中的self.__a = 4, 实际上__a被修改成了_A__a保持在类中了。
  2. 没有static的说法了,类和实例是区分看待的,一个属性或者方法可以属于类也可以属于实例。

    看下面的例子

    class A:
        i = ‘class var‘
        def __init__(self):
            self.i = ‘instance var‘

    a = A()
    print A.i, a.i

    #result class var instance var

    类和实例之间的元素和函数都是独立的。
    当然如果你要定义属于类的方法,因为旧的对象定义强制方法是要带self参数的,不然调用会出错的,所以需要static函数,可以这样做:

    class A:
        i = ‘class var‘
        def __init__(self):
            self.i = ‘instance var‘
        def f(): pass
        f = staticmethod(f)

  3. 类和实例中的属性和方法实际上都是放在类和实例自身的一个字典中,就是__dict__中,所以他们实际上可以看成不同的两个东西。
    类本身也是对象,所以类和实例都可以在程序中的任何地方进行添加,修改和删除。对的你甚至可以用del来删除类中的属性和函数。
  4. 那么当你需要使用类或者实例中的属性和方法时,python是如何寻找的呢?
    python中的所有的类和实例将会根据他们的继承关系组成一个对象属性树。
    树的叶子节点是实例,内部节点根据类之间的继承关系来决定。
    当使用A.a的方法来查找一个节点中的某个元素时,它将在这棵树上进行搜索,如果当前节点没有该元素则向上继续搜索直到根节点,如果向上的过程中出现两条以上路径(想想为什么有这种情况),则从左边向上走,如果到根节点还没有找到,那么返回到出现分叉的点再往右一条路向上。
    这种寻找方法即使出现了多重继承(其实就是上面说的两条以上路径)也不用担心出现C++中的情况。

    大概就这些,我发现大部分面试时候还是考的这种我第4点中说的,所以其实想明白很重要。。而且我认为这种方法还是相当优雅滴~~
时间: 2024-12-26 07:14:04

Python OOP总结的相关文章

<转>Python OOP(1):从基础开始

转自  http://www.cnblogs.com/BeginMan/p/3510786.html 本文旨在Python复习和总结: 1.如何创建类和实例? # 创建类 class ClassName(object): """docstring for ClassName""" def __init__(self, arg): super(ClassName, self).__init__() self.arg = arg # 创建实例 ins

Python -- OOP高级 -- 枚举类

Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较. from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) for name, member in Month.__members__.items(): print("%s => %s, %d&quo

python>oop

oop即Object Oriented programming,面向对象编程 何为编程:特定的语法+数据结构+算法 编程范式就是从经验中总结的套路: 面向过程编程 适用于简单的脚本,一次任务是极好的,但是复杂的,需要后期维护的就**了 面向函数编程 将电脑运算视为数学上的函数计算 优点:可读性强,因为数据不可变,所以多线程安全,完成同功能代码量比oop少,更清晰,速度也要高很多 缺点:由于数据不可变,所以非常占用运算资源,先天设计导致性能一直不够,要想大规模的使用函数式编程,还有很多问题 面向对

python oop 多态 封装 反射

python中关于OOP的常用术语 抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现这种模型.抽象不仅包括这种模型的数据属性,还定义了这些数据的接口. 对某种抽象的实现就是对此数据及与之相关接口的现实化(realization).现实化这个过程对于客户 程序应当是透明而且无关的. 封装/接口 封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数.通过任何客户端直接对数据的访问,无视接口,与封装性都是背道而驰的,除

Python OOP(2)-static method,class method and instance method

静态方法(Static Method): 一种简单函数,符合以下要求: 1.嵌套在类中. 2.没有self参数. 特点: 1.类调用.实例调用,静态方法都不会接受自动的self参数. 2.会记录所有实例的信息,而不是为实例提供行为. 简单说staticmethod 无法访问类属性.实例属性,相当于一个相对独立的方法,跟类其实没什么关系,换个角度来讲,其实就是放在一个类的作用域里的函数而已. #!python2 #-*- coding:utf-8 -*- class A: v1="class ar

Python -- OOP高级 -- 元类

type()函数既可以返回一个对象的类型,又可以创建出新的类型 def fn(self, name="world"): print("Hello, %s!" % name) Hello = type("Hello", (object,), dict(hello=fn)) h = Hello() >>> h.hello() Hello, world! >>> type(h) Out[165]: __main__.

python oop

1.  python中的__str__()函数 2.python 何时单用__hash__或__eq__何时一起用     https://blog.csdn.net/sinat_38068807/article/details/86519944#%EF%BC%881%EF%BC%89%E4%BB%A5%E4%B8%8B%E4%BB%A3%E7%A0%81%E5%8F%AA%E7%94%A8%E5%88%B0%E4%BA%86__eq__%EF%BC%8C%E5%9B%A0%E4%B8%BA%E

Python面向对象OOP

一 OOP     与C++和Java一样,Python同样具有OOP设计. 过程式:从前到后,一条一条,机器能接受的顺序性方式:方式大概为"首先你应该做什么,第二应该做什么,高级点的做点假设如果遇到什么情况要做什么,或者一件事情要做多少多少遍,- -," OOP式:从"类与对象"方式来抽象和理解世界.例如首先物体(Object)大概可以分为"生物"与"非生物","生物"又能分为"人.动物.植物&

python中oop

转自  http://www.cnblogs.com/BeginMan/p/3510786.html 本文旨在Python复习和总结: 1.如何创建类和实例? # 创建类 class ClassName(object): """docstring for ClassName""" def __init__(self, arg): super(ClassName, self).__init__() self.arg = arg # 创建实例 ins