面向对象
注意
python 创建对象分为新版本的对象和旧版本的对象,旧版本的对象保留是为了向上兼容,一般情况下都可以直接使用新版本的对象。
创建新版本的对象的方式是在对象前几行写上
__metaclass__ = type #以type 作为元类,具体解释比较复杂,以后再写
类的属性和方法
类的私有变量和方法
所有用__开头的变量或者方法都是私有变量和方法,不过还是可以通过其它的名字访问
事实上,只是把所有双下划线开头的名字前面加上了单下划线加类名而已
类变量/实例变量
类变量在类中公用,用 类名.变量名 调用
实例变量只属于这个实例,用 实例名.变量名 或者 self.变量名 调用
一些内置属性 (class 指类,object 指实例)
class.__dict__ 类的属性
class.__name__ 类名
object.__dict__ 实例的属性
class.__doc__ 类的介绍文档,在定义类的开头定义的
class.__module__ 类定义所在的模块
class.__bases__ 类的所有父类
object.__class__ 实例的类
object.__class__.__name__ 实例的类名
一些类内部的保留方法
__init__ 初始化类的方法(构造方法)
__del__ 类在被销毁时会调用的方法
一些方法
hasattr(object, name) 返回布尔值,看一个对象中是否有某一个属性
getattr(object, name[,default]) 获取对象的某个属性,如果不存在,返回默认值。如果获取的是方法,返回的则是该方法的内存地址,如果后面再加一对括号就是调用它。
setattr(object, name, values) 修改对象的属性
issubclass(child_class,bases_class) 返回布尔值,bases_class 是不是child_class 的父类
isinstance(object, class) object 是不是class的实例对象或者class子类的实例对象
super(自己的类名,self) 找到父类,只能用于新版本的类,可以在调用父类方法时使用
例子
code
#!/usr/bin/python
class team:
'read me' # 这一行会作为__doc__
company_name="xx" #类变量
def __init__(self,name,team_id="100"): #初始化方法
self.team_name = name
self.__team_id = team_id #__私有变量
def set_name(self,name):
self.team_name = name
def get_name(self):
return self.team_name
def set_company_name(self,name):
team.company_name = name
def get_company_name(self):
return team.company_name
def __del__(self): #会在销毁类的时候被调用
print "del:" + self.__class__.__name__ + ':' + self.team_name
class employee(team): #team 的子类
def __init__(self,team_name,name):
self.team_name = team_name
self.name = name
def set_team_name(self,name):
team.set_name(self,name) #调用父类方法的方式
#super(employee,self).set_name(name) #如果是新版本的类的话可以这样写
def get_team_name(self):
return self.team_name
sa = team("sa")
network = team("network")
print """
Show the Class
==========================================================="""
print "team.__dict__:",team.__dict__
print "team.__doc__:",team.__doc__
print "team.__module__:",team.__module__
print "team.__bases__:",team.__bases__
print "employee.__bases__:",employee.__bases__
print "team.__name__:",team.__name__
print "sa.__dict__:",sa.__dict__
print "vars(sa)",vars(sa)
print "sa.__class__:",sa.__class__
print "sa.__class__.__name__:",sa.__class__.__name__
print "sa.team_name:" + sa.team_name
print "sa._team__team_id:" + sa._team__team_id #访问私有变量,还不够私有。。。。。嗯
print 'hasattr(sa,"team_name"):',hasattr(sa,"team_name")
print 'setattr(sa,"xx","xx"):',setattr(sa,"hahaha","wawawa")
print 'after set attr:',sa.__dict__
print 'getattr(sa,"team_name"):',getattr(sa,"get_name")
print 'getattr(sa,"team_name")():',getattr(sa,"get_name")() #直接调用该方法
print """
using class function
==========================================================="""
print "sa team name:"+sa.get_name()
print "sa compant name:"+sa.get_company_name()
sa.set_name("dba")
print "sa set name to dba"
print "sa team name:"+sa.get_name()
print "compant name:"+network.get_company_name()
sa.set_company_name("abcd")
print "sa set company name to abcd"
print "network team company name:"+network.get_company_name()
print """
SUB class:
==========================================================="""
leo = employee("sa","leo")
print "leo team name" + leo.get_team_name()
print "leo set team name to abc"
leo.set_team_name("abc")
print "leo team name" + leo.get_team_name()
print "employee is sub class of team :",issubclass(employee,team)
print "sa is object from Class employee:",isinstance(sa,employee)
print "sa is object from Class team:",isinstance(sa,team)
print """
Script end, auto delete the object:
==========================================================="""
运行结果
[root@hadoop1 python]# ./oo.py
Show the Class
===========================================================
team.__dict__: {'set_name': <function set_name at 0x7f30518f25f0>, 'set_company_name': <function set_company_name at 0x7f30518f26e0>, '__del__': <function __del__ at 0x7f30518f27d0>, 'get_company_name': <function get_company_name at 0x7f30518f2758>, '__module__': '__main__', 'get_name': <function get_name at 0x7f30518f2668>, 'company_name': 'xx', '__doc__': 'read me', '__init__': <function __init__ at 0x7f30518f2578>}
team.__doc__: read me
team.__module__: __main__
team.__bases__: ()
employee.__bases__: (<class __main__.team at 0x7f30518e7890>,)
team.__name__: team
sa.__dict__: {'team_name': 'sa', '_team__team_id': '100'}
vars(sa) {'team_name': 'sa', '_team__team_id': '100'}
sa.__class__: __main__.team
sa.__class__.__name__: team
sa.team_name:sa
sa._team__team_id:100
hasattr(sa,"team_name"): True
setattr(sa,"xx","xx"): None
after set attr: {'team_name': 'sa', '_team__team_id': '100', 'hahaha': 'wawawa'}
getattr(sa,"team_name"): <bound method team.get_name of <__main__.team instance at 0x7f30518faa70>>
getattr(sa,"team_name")(): sa
using class function
===========================================================
sa team name:sa
sa compant name:xx
sa set name to dba
sa team name:dba
compant name:xx
sa set company name to abcd
network team company name:abcd
SUB class:
===========================================================
leo team namesa
leo set team name to abc
leo team nameabc
employee is sub class of team : True
sa is object from Class employee: False
sa is object from Class team: True
Script end, auto delete the object:
===========================================================
del:team:network
del:team:dba
del:employee:abc