zoukankan      html  css  js  c++  java
  • Python之面向对象:类的内置方法

    1、def __add__(self,other):
    c1+c2 两个实例的加法操作就是执行__add__()方法
    2、__str__(self):
    print一个实例的时候,执行的是__str__()这个内置方法
    eg:
    class Vector(object):
         def __init__(self,a,b):
             self.a = a
             self.b = b
         def __str__(self):
             return 'Vector(%d,%d)'%(self.a,self.b)
         def __add__(self, other):
              return Vector(self.a+other.a, self.b+other.b)
     
    v1 = Vector(2,8)
    v2 = Vector(4,98)
    # print v1 + v2
    v3 = v1 + v2
    print v3
    print v1#
     
    3、__del__()
    实例消亡的时候执行
    4、类的帮助信息 三引号中的内容
    __doc__
    ''' Production of the class A
    attr:
    method:
    '''
    5、类的实例属性是字典的时候,使用以下三个方法
    __getitem__() :返回当前的实例属性的字典值
    __setitem__():属性中的key和value重新赋值
    __delitem__():删除实例属性中的某个字典key和value值
     
    class A(object):
    '''Production of the class A:
    attr:
     
    method:
    end.'''
    #__getitem__
    #__setitem__
    #__delitem__
    class Employee(object):
        def __init__(self,name,salary):
            self.dict1={}
            self.dict1[name]=salary
        def __getitem__(self, key):
             if self.dict1.has_key(key):
                 print key,self.dict1[key]
        def __setitem__(self, key, value):
             self.dict1[key]=value
        def __delitem__(self, key):
             if self.dict1.has_key(key):
        del self.dict1[key]
     
    e1=Employee('Lily',10000)
    e1['Lily']
    e1['Jenny']=20000
    e1['Jenny']
    del e1['Jenny']
    e1['Jenny']
     
    6、实例属性是序列的时候,所作的切片操作
    __getslice__():对实例属性做切片
    __setslice__():
    __delslice__():
     
    7、__call__(self,*args,**kwargs)
    通过实例对__call__方法重写 e1(1,2,3,a='abc')
     
    8、__dict__ 返回属性和方法
    Employee.__dict__ :类属性和所有的方法
    e.__dict__ 实例属性和类的指针
     
    9、__iter__() 使用迭代器,返回迭代器的内容时,就是调用了__iter__方法,返回一个迭代器
    def __iter__(self):
        return iter(self.list1[:])
    eg:
    class Employee(object):
        def __init__(self,name,salary):
            self.list1=[]
        def __getslice__(self,i,j):
            return self.list1[i:j]
        def __setslice__(self, i, j, sequence):
             self.list1[i:j]=sequence
        def __delslice__(self, i, j):
              del self.list1[i,j]
        def __iter__(self):
             return iter(self.list1[:])
     
    e1=Employee('Lily',10000)
    e1[:4]='fjwioefjior'
    print e1[:]
    for i in e1:
        print i
    10、__new__(cls,*args,**kwargs):
    new的时候才生成了实例,所以是类方法
    return object.__new__(cls,*args,**kwargs)
    a=A() 这个时候会默认先执行__new__这个内置方法
    使用在单例(只有一个实例)这种设计模式中:
    通过 __new__方法实现单例的思路:创建实例之前,判断是否创建过,如果有,不重新创建,没有则重新创建
    #__new__
    class A(object):
        def __init__(self,a):
            print 'init method'
           self.a = a
       def __new__(cls, *args, **kwargs):
            if not hasattr(cls,'_instance'):
                cls._instance = object.__new__(cls,*args, **kwargs)
       return cls._instance
     
    之前是否创建过实例,如果有,则不重新创建,如果没有,则重新创建
    a1 = A(4)
    print a1.a # 4
    a2 = A(6)
    print a2.a # 6
    print a1.a # 6
    实例属性是同一个,但是每次实例化的时候,还会再执行__init__()方法
     
  • 相关阅读:
    LeetCode 43 字符串相乘
    HDU 1031 Design T-Shirt
    HDU 1728 逃离迷宫
    HDU 1285 确定比赛名次
    HDU 1116 Plays on words
    HDU 1195 Open the lock
    HDU 1072 Nightmare
    HDU 1272 小希的迷宫
    HDU 1273 漫步森林
    HDU 1269 迷宫城堡
  • 原文地址:https://www.cnblogs.com/emily-qin/p/7059839.html
Copyright © 2011-2022 走看看