• 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
    # 创建实例
    instance = ClassName()      
    

    2、经典类与新式类的区别?

    3、什么是方法?如何定义?如何使用?

    方法是类的功能
    定义在类中
    通过实例调用

    4、self代表什么?用在哪些地方?

    每个类方法都有一个self参数,代表实例对象本身,当实例调用方法时,由解释器悄悄地传递给方法,不用手动self进来。
    self在Python里不是关键字。self代表当前对象的地址。self能避免非限定调用造成的全局变量。
    wangkangluo1的Python为什么要self中讲的很清楚:

    创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2) ,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2)
    这就是Python的self的原理了。即使你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数。

    5、类对象的两种操作?

    定义完类之后就产生了类对象,类对象支持的两种操作:引用和实例
    引用:通过类对象去调用类中的属性或方法;实例:通过类对象实例化一个类对象的实体。

    6、什么是Python类属性和实例属性?

    属性就是另一个对象的数据或函数元素!通过句点符号访问,如一些python类型如复数有数据属性,列表和字典拥有方法(函数属性)。还有可能是,访问一个属性时,这个属性又是对象,其又拥有自己的属性,这样就构成了属性链。如:

    >>> import sys
    >>> sys.stdout.write('beginman')
    beginman
    >>> myMoudel.myClass.__doc__
    

    类属性与类相关,与实例无关,通常是类的数据属性,仅仅是类中定义的变量,通常称作静态变量或静态数据。在其他语言中相当于在变量前加上static

    >>> class C(object):
        foo = 100  # 定义类属性
    
    
    >>> print C.foo # 访问类属性
    100
    >>> C.foo = C.foo+100 # 更新类属性
    >>> C.foo
    200
    

    由上所知,类属性仅仅与类(类也是对象,python中称类对象)相关,与实例半毛钱关系都没有。

    >>> class C(object):
        foo = 100  # 定义类属性
    
    
    >>> print C.foo # 访问类属性
    100
    >>> C.foo = C.foo+100 # 更新类属性
    >>> C.foo
    200
    >>> c=C()  # 实例化一个对象c
    >>> c.foo
    200
    >>> c.foo = 1000  # 实例试图修改类属性
    >>> c.foo # 实例想看是否修改成功,于是就c.foo竟输出1000,于是实例就满以为自己成功了
    1000
    >>> C.foo # 类对象鄙夷的看了实例一样,说:“你就是老子生出来的,老子的东西你也能碰??”
    200
    >>> del c.foo # 实例看完之后当场傻眼,心想mlgb,你牛B,我还是除掉自己负担沉重的改造吧
    >>> c.foo  # 实例除掉了自己负担沉重的改造后,老老实实地调用类对象给的sb玩意
    200
    >>> # 通过类对象与实例关于类属性争权大战后,我们知道了一点:
    >>> #类属性仅仅与类(类也是对象,python中称类对象)相关,与实例半毛钱关系都没有。
    >>> #如果类的实例没有同名变量也可以使用实例来访问。如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。如果类的实例没有同名变量也可以使用实例来访问。如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。
    >>> 
    

    7、类方法?

    >>> class C(object):
        foo = 100
        def met(self):
            print 'i am method for class.'
    
    
    >>> C.met()  # C心想方法也是我的一部分,那么方法也是类属性*(这点很正确),于是我调用你玩玩
    
    Traceback (most recent call last):
      File "<pyshell#31>", line 1, in <module>
    C.met()  # C心想方法也是我的一部分,那么方法也是类属性*(这点很正确),于是我调用你玩玩
    TypeError: unbound method met() must be called with C instance as first argument (got nothing instead)
    >>> # 出大事了,方法竟然不同意还反抗了
    >>> # 心想这是为什么呢?突然想到了原来是那鸟人Python
    >>> # 鸟人 Guido van Rossum 创造Python类给出的规定就是,你可以创类方法,但是不能调戏她。
    >>> c=C() # 类心有不甘,于是创了实例小c来助纣为虐
    >>> c.met() # 实例小c心想,mlgbd,上次想修改类属性就被你狠狠地鄙视了一番,现在又为难我,唉,命苦。无论如何试试吧
    i am method for class.
    >>> # 龌龊,类方法竟然听我实例的,于是实例就赶紧找Guido van Rossum问什么情况
    >>> # Guido van Rossum就说”为了与OOP惯例保持一致,没有实例就不能调用方法,这种限制就是Python所描述的绑定概念,方法必须绑定在实例中才听话,不能把权利都交给了类,这是老子对你实例的恩惠啊。“
    >>> # 实例听完泪牛满面,类对象发怒了,说:”今天,我就要把我身上的所有零件(属性)都掏出来看看,看都有谁不听话!“
    >>> dir(C) # 于是类对象使用第一招 dir()内建
    ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo', 'met']
    >>> print C.__dict__  # 第二招就是召遣他最听话的属性 __dict__ 来揪出
    {'__module__': '__main__', 'met': <function met at 0x0000000002D33EB8>, '__dict__': <attribute '__dict__' of 'C' objects>, 'foo': 100, '__weakref__': <attribute '__weakref__' of 'C' objects>, '__doc__': None}
    >>> 
    

    类对象出尽风头之后,该轮到实例了:

    实例的创建:
    C++等编程应用,实例对象是New出来的,Python牛b,就跟人家不一样,偏以函数调用的形式实例化。

    class CC(object):
        #我是Python类默许的,没重写__init__,所以也没有什么特殊操作
        pass
    
    
    class C(object):
        def __init__(self,name,phone,ID):
            super(C,self).__init__()
            self.name = name
            self.phone = phone
            self.id = ID
            print 'Hi man 我重写了__init__,因为我需要更多的操作'
    
    cc = CC() # 创建CC实例
    c = C('BeginMan','110','12306') # 创建C实例
    

    重点:
    当类被调用,实例化的第一步就是创建实例对象,然后Python检查是否实现了__init__()方法,默认情况下如果没有覆盖__init__就不会施加特别的操作。任何特别的操作都需要重写__init__
    接着就是传递参数,这依赖于你自己定义的__init__,它里面有多少个参数,在实例化的过程中就要传多少个参数,不管是否覆盖了__init__(),实例对象都要作为第一个参数传递进去。

    __init____new____call__的区别:

    __new__更像真正的构造器,创建对象时调用,返回当前对象的一个实例。但是实际中用的很少。
    __init__:初始化工作,创建对象时调用,对当前对象的实例进行初始化,无返回值。在Python中很常用的。
    __call__:让类的实例的行为表现的像函数一样,你可以调用他们,将一个函数当做一个参数传到另外一个函数中等等。很少用。
    优先级:__new__先与__init__

    __del__析构器方法,见《py 核心》

    实例属性:

    可在创建实例后的任意时间创建,也可以在"运行时"创建.__init__()是创建这些属性的关键点。

    >>> c.__dict__  # 此时实例c还没属性
    {}
    >>> c.__class__ # 实例化的类
    <class '__main__.C'>
    
    >>> c.foo=1
    >>> c.name='CS'
    >>> c.__dict__
    {'foo': 1, 'name': 'CS'}
    >>> dir(c)
    [***'foo', 'name'***,'__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
    

    python面向对象与其他语言的异同点?

    大同小异
    Differences between “Java OOP” and “Pythonic OOP”?
    真tm的拗口,谁英文好能翻译下。

    什么是构造器,__init__表示什么? 有什么意义?

    参考面向对象的编程init方法

    OOP常用术语

    这在软件工程经常见到的,由于Python OOP实际运用的并不是太多,所以对于OOP特征的体现就不那么明显,C++/Java/C# OOP思想体现倒是挺深的,不过本人太菜,难以熟谙OOP的精髓。
    面向对象程序设计中的常用术语总结
    其中对还包括自省

    什么是Python自省(反射)?

  • 相关阅读:
    北京燃气IC卡充值笔记
    随机分析、随机控制等科目在量化投资、计算金融方向有哪些应用?
    量化交易平台大全
    Doctor of Philosophy in Computational and Mathematical Engineering
    Institute for Computational and Mathematical Engineering
    Requirements for the Master of Science in Computational and Mathematical Engineering
    MSc in Mathematical and Computational Finance
    万字长文:详解多智能体强化学习的基础和应用
    数据处理思想和程序架构: 使用Mbedtls包中的SSL,和服务器进行网络加密通信
    31-STM32+W5500+AIR202/302基本控制篇-功能优化-W5500移植mbedtls库以SSL方式连接MQTT服务器(单向忽略认证)
  • 原文地址:https://www.cnblogs.com/cmybky/p/11772708.html
Copyright © 2020-2023  润新知