Python 对象

evernote 连接:https://app.yinxiang.com/shard/s7/sh/a79f4403-3594-4142-99c4-e57495d70646/ae22ad3c1ce2e9dd

#!/usr/bin/env python

# -*- encoding: utf-8 -*-


'''

Created on 2014年12月31日


@author: cuckoocs

'''


'''

笔记1:

    使用is判断是否是同一个对象引用

    使用==判断值是否相同

    使用type判断类型是否是一样

    

    Python 不可变对象:元组(tuple)、数值型(number)、字符串(string)

    Python 可变对象:字典型(dict)和列表型(list)

    Python 中存在有一些引用不变的对象[Python 中对于整数和字符串在内存中是不变引用]

    {

        >>> i = 2

        >>> i2 = 2

        >>> i is i2

        True

        

        >>> s = 'uiui'

        >>> s2 = 'uiui'

        >>> s is s2

        True

        

        #浮点数引用为变化的

        >>> t = 2.3

        >>> t2 = 2.30

        >>> t is t2

        False

        >>> t2 = 2.3

        >>> t is t2

        False

        >>> t == t2

        True

        >>> y = (1,2)

        >>> y2 = (1,2)

        >>> y is y2

        False

        >>> 1.0 is 1.0

        True

        >>> f1 = 1.0

        >>> f1 is 1.0

        False

    }


笔记2:

    判断对象类型可以使用type和isinstance

    type不能识别继承类型

    isinstance(object, type)能判断继承


笔记3:

    使用sys.getrefcount可以获得对象的引用次数


笔记4:

    使用copy模块可以实现浅拷贝和深拷贝

    浅拷贝:对象内的引用依然是引用,

    深拷贝:拷贝原始内存数据



笔记5:

    Python中所有对象都是第一类对象。所有能够命名的对象都能当做数据处理,包括函数,模块,异常等

    {

        a[1] = abs    #函数

        a[1](-9)

    }


笔记6:

    对于序列的切片[1:8]是包含1,但是不包含8(左闭右开)

    对于xrange和range也同样使用左闭右开原则


笔记7:

    Python 中有set和frozenset两种集合,set为可变,frozenset不可变

    对于set集合,使用for遍历的时候不能一边遍历一边删除

    集合中不存在重复项


笔记8:

    函数:单独定义(在类之外定义)

    方法:定义在类中


笔记9:

    Python 类中有三种方法,实例方法,类方法,静态方法

    实例方法通过实例调用,定义时传递一个self参数代表实例自身

    类方法通过类调用,使用@classmethod声明,定义时传递一个cls参数代表类对象

    静态方法为打包在类中的函数,使用@staticmethod声明


笔记10:

    #对于绑定方法

    cls = mlist(1)   #创建实例

    mth = cls.instance_method #通过实例绑定方法时,同时绑定了实例,此处注意有括号和没有括号都可以,在有括号的情况下接下来的调用可以不带括号直接使用名字就调用,注意需要传递参数时候最好不带括号

    mth(1)          #方法调用

    

    #非绑定方法

    mth = mlist.instance_method #通过类绑定,没有绑定实例,调用时候需要传递一个实例

    mth(cls)


笔记11:

    通过引用self.来定义一个实例变量,在__init__()类同于构造方法


笔记12:

    Python中控制访问权限的方法

    定义属性和方法时,使用'__'前缀并且不使用'__'后缀,定义为一个私有变量或方法

    但是仍然可以使用 实例._类名__属性名[方法名] // 类名._类名__属性名[方法名]访问实例私有属性和类私有属性

    

    Python中使用'__xx__'的方式定义为内置方法和属性


笔记13:

    Python中的内置类型


'''


import sys
import copy
star_30 = '*'*30
class mlist(list):
    '''
    定义一个空对象继承list
    '''
    mfield = {'info':'mlist'}
    __sy__ = 'private'
    
    def __init__(self, h=None, w=None):
        self._h = h
        self._w = w
        self.__t = 0
        
        
    def __pri_fun(self):
        print '__pri_fun__'
    
    
    def __call__(self, h=None):
        print 'call method'
    
    def instance_method(self, f=None):
        print 'instance method'
    
    @classmethod
    def class_method(cls):
        print 'class method'
        pass
    
    @staticmethod
    def static_method():
        print 'static method'
        pass
    
def compare(objA, objB):
    print star_30
    if objA is objB:
        print 'is the same object'
        
    if objA == objB:
        print 'value is same'
        
    if type(objA) is type(objB):
        print 'type is same'
def detect_type(obj):
    print star_30
    ot = type(obj)
    print ot
    print 'is list {}. type'.format(ot is mlist)
    print 'is list {}. isinstance'.format(isinstance(obj, list))
if __name__ == '__main__':
    #对于绑定方法
    cls = mlist(1)   #创建实例
    mth = cls.instance_method #通过实例绑定方法时,同时绑定了实例,此处注意有括号和没有括号都可以,在有括号的情况下接下来的调用可以不带括号直接使用名字就调用,注意需要传递参数时候最好不带括号
    mth()          #方法调用
    #方法2
    mth = cls.instance_method(1)
    mth
    
    #非绑定方法
    mth = mlist.instance_method #通过类绑定,没有绑定实例,调用时候需要传递一个实例
    mth(cls)
    
    cls.__call__()  #对以‘__’开头定义的私有方法是可以调用的,但是
    #cls.__pri_fun()
    cls._mlist__pri_fun() #访问私有方法
    
    print mlist.__sy__
    #print cls.__t
    print cls._mlist__t #通过这样的方法可以访问私有变量
    print cls.__class__
    print cls.__dict__['_h']

    



你可能感兴趣的:(python,对象)