# -*- 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
"""
Python自学5:Python的类(一切皆为Object)
最新推荐文章于 2024-02-24 20:34:47 发布