Python自学5:Python的类(一切皆为Object)

# -*- coding:utf-8 -*- 
#Python自学5:Python的类(一切皆为Object)

#面向对象是一种思想,而不是一种语言。面向对象的目的是代码重用,减少重复性的开发,面向
#对象是代码重用机制包括封装(encapsulation)、继承(Inheritance)、多太(Polymorphism)。
#面向对象的核心是抽象(abstraction)、分离接口(interface)、实现(implemetation)。

#一、什么是Object
#   在Python中,Object泛指一切。包括class、module、package、int、float、list等和一切用户程序中定义的东西

#   name space:name space是name和object之间的映射关系。每一个name唯一的和一个object绑定,但是一个object
#               可以有多个name。如果没有name和object绑定,那么object就会消失。
#               name space是一个动态的数据结,即dictionary。
#   name:                name是一个字符串,指向一个object。name是name space中的一个元素。
#   object:           object是一个独立的name space。object的name space用dictionary表示。多数情况下,
#               obj.__dict__表示一个object的name space。其中obj.__dict__.keya()表示所有name的list,
#               obj.__dict__[name]表示name所指的object。
#   alias:              如果两个name指向同一个object,那么这两个name互为alias。
#   attribute:  name分为两种,一种unqualified name;一种qualified name。如果同obj.attr形式的name就是qualified name;
#               如同obj形式的name就是unqualified name。Attribute(属性),是qualified name的"."后面部分。
#               创建Attribute方法:obj.new_attribute = other;或者setattr(obj,"new_attribute",other)
#               删除Attribute方法:del obj.old_attribute;或者delattr(obj,"old_attribute")
#               查询一个Attribute方法:hasattr(obj,"old_attribute")
#               得到所有attribute方法:dir(obj)

#二、什么是class object
#    class SimplestClass:
#        pass

#三、私有属性:
#    Python中默认的成员函数、成员变量都是公开的(public),而且python中没有类似java的public、private等关键词来修饰成员函数,成员变量。
#    在python中定义私有变量只需要在变量名或函数名前加上 "__" (两个下划线),那么这个函数或变量就会成为私有的了。

#四、Python的class特殊方法(方法可以被重载)
#    1、__int__:在obj=A_Class(arg,...)时候自动调用,类似java的构造函数,它的参数除self还有A_Class中传递的参数
#    2、__del__(self):在对象被删除的时候自动调用
#    3、__repr__(self):使用repr(obj)时候调用,这个函数返回和eval()兼容的对象字符串表达式,用于重建对象。
#                       也就是说,如果eval(repr(obj))会得到一个对象的拷贝。
#    4、__str__(self):会返回一个字符串描述对象的本身

class A:
    def __repr__(self):
        return "A()"

    def __str__(self):
        return "OK,I am here"

x = A()
print "x=",x                #结果:x= OK,I am here
print "repr(x)=",repr(x)    #结果:repr(x)= A()
b = eval(repr(x))
print "b=",b                #结果:b= OK,I am here
#注:eval(str)是用来计算一个python表达式,并且返回这个表达式

#    5、__cmp__(self,other):一个比较操作符。0表示相等,1表示大于,-1表示小于。
#    6、__hash__(self):返回一个32位的hash value。重载这个函数以后,这样的class instance就可以作为dictionary数据结构中的key
#    7、__nozero__(self):以前我们用None,"",()等表示逻辑假,其它的都是真,其实不完全对,这里可以定义一个对象是否是逻辑假。
#                        如果返回0表示逻辑假,其它是逻辑真。
#    8、__len__(self):在调用内置函数len时,会被调用,返回object的长度。如果没有定义这个函数,调用len(obj)会导致异常
#    9、__getitem__(self,key):返回self[key]用来模拟list、dictionary、tuple等数据结构
class Zoo:
    alive = 0
    def __nonzero__(self):
        if self.alive == 0 :
            return 0
        else :
            return 1
    def __len__(self):
        return 100
    def __getitem__(self,key):
        if key == "dog" : return "dog"
        elif key == "pig" : return "pig"
        else : return "unknown"
zoo = Zoo()
print "cat.alive =",zoo.alive
if zoo :print "the zoo is alive"
else : print "the zoo is dead"

print "zoo[dog]=",zoo["dog"]                    #结果:zoo[dog]= dog

#    10、__contains__(self,other):可以使object像sequence,处理in语句
#    11、__call__(self,arg1,arg2,...):让object像函数一样,可以调用。

class People:
    def __contains__(self,other):
        if other == "ok" : return 1
        return 0
    def __call__(self,*arg):#这里可使用可变参数机制,打印所有传进来的参数
        for i in arg:
            print i

p = People()
p("I","am","a","boy")

"""其它的
        __add__(self,other)    self + other
        __sub__(self,other)    self - other
        __mul__(self,other)    self * other
        __div__(self,other)    self / other
        __mod__(self,other)    self % other
        __divmod__(self,other)    divmod(self,other)
        __pow__(self,other)    self ** other
        __pow__(self,other,modulo)    pow(self,other,modulo)
        __lshift__(self,other)    self << other
        __rshift__(self,other)    self >> other
"""

































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值