1:类和对象
是面向对象中的俩个重要概念,类是对事物的抽象,比如人类,球类。对象是事物的实例,比如足球,篮球。球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球体出来。
2:类的定义
类把需要的变量和函数组合成一起,这种包含称为“封装”。。classA(object):
3:类的结构
class类名:
成员变量-属性 ## 类的属性是对数据的封装
成员函数-方法 ## 类的方法是对类的行为进行封装
类的创建:
class MyClass1(object): ## 类名
color = 'Black' ## 类的属性-变量
def fun(self): ## 类的方法中必须有参数self,这是成员函数类的方法
print "I am function"
1
|
<span style = "font-family:'宋体', SimSun;font-size:12px;" > #!/usr/bin/python<br>class People():<br> color = 'yellow' ## 成员变量<br> def think(self): ## 成员函数<br> self.color = 'Black' ## self表示类本身<br> print 'I am a %s' % self.color<br> print 'I am a thinker'<br>ren = People() ## 把类赋予一个变量,即实例化<br>print ren.color<br>ren.think()<br></span>
|
4:类的属性
公有属性:在类中类外都可以使用。
私有属性:只能在类中使用,定义方式为__name(双下划线)
内置属性:由系统定义类的时候默认添加的,由前后双下划线构成。__dict__,__module__。
1
|
<span style = "font-family:'宋体', SimSun;font-size:12px;" > #!/usr/bin/python<br>class People():<br> color = 'yellow'<br> __age = 20<br> def think(self):<br> self.color = 'Black'<br> print 'I am a %s' % self.color<br> print 'I am a thinker'<br> print self.__age ## 私有函数,只能在类中使用<br>ren = People()<br>print ren.color<br>ren.think()<br>print ren._People__age ## 仅测试使用,类外使用私有函数<br></span>
|
5:类的方法相当于函数,类的属性相当于变量。
方法的定义跟函数一样,但是需要self作为第一个参数。
公有方法:跟公有属性一样,类内类外都可以使用
私有方法:跟私有属性一样,只能类内使用。__self
self:用来区分类跟方法,self本身表示类
类方法:被classmethod编译过的函数,能被类所调用,也能被对象调用(继承的关系)
静态方法:被staticmethod编译过的函数,可以被类直接调用,静态方法不需要设置self参数。
装饰器:
@classmethod:类方法
@staticmethod:静态方法
6:对象的创建
创建对象的过程称之为实例化:当一个对象被创建后,包含三个方面的特性:对象句柄,属性,方法。句柄用来区分对象。
对象的属性和方法与类中的成员变量和成员函数相对应
object=MyClass() ## 创建类的一个实例(对象),通过对象来调用方法和属性
1
|
<span style = "font-family:'宋体', SimSun;font-size:12px;" > #!/usr/bin/python<br># coding:utf-8<br>class MyClass1(object): ## 类<br> color = 'Yellow' ## 类的属性--变量<br> __age = 20 ## 类的私有属性,只能在类中使用<br> @classmethod<br> def __hide(self): ## 类的隐藏方法,只能在类中使用<br> print "I am hidemethods!"<br> @classmethod ## 装饰,对象和类都可以调用<br> def fun(self): ## 类的方法--函数<br> print self.__age ## self等同类,表示调用类的私有属性<br> print 'This is function!'<br> @staticmethod ## 装饰,对象和类都能调用,不需要self<br> def fun1(): ## 不需要self<br> print MyClass1.color ## 直接使用类调用类的属性或方法<br> MyClass1.__hide() ## 调用类的隐藏方法<br> class InsideClass(object): ## 类中类,内部类<br> Inside = 'Red' ## 内部类的属性<br> @classmethod<br> def InsideFun(self): ## 内部类的方法<br> print self.Inside<br>object = MyClass1() ## 对象,实例化类<br>object.fun() ## 对象调用类的方法<br>MyClass1.fun() ## 类调用类的方法<br>MyClass1.fun1()<br>object_inside = object.InsideClass() ## 先调用外部类,再调用内部类<br>MyClass1.InsideClass.InsideFun() ## 调用内部类的方法<br>print object_inside.Inside ## 调用内部类的属性<br></span>
|
7:内部方法(魔术方法)
def __str__(self): ## 如果直接实例化类,会返回__str__的值,而不是提示这样<对象>
return "This is class object!"
构造函数
def __init__(self,c='Black'): ## 初始化对象的属性,但不会改变类的属性
self.color = c
析构函数
def __del__(self): ## 主要用于释放资源,一般执行与脚本的最后
1
|
<span style = "font-family:'宋体', SimSun;font-size:12px;" > #!/usr/bin/python<br>class PeoPle(object):<br> color = 'Black'<br> def __init__(self,c): ## 初始化属性,c需要在实例化类的时候,跟在后面<br> self.color = c<br> print "Init runinng ......" ## 只要把类实例化成对象,就会打印这行,<br> def fun1(self):<br> print "Color is: %s" % self.color<br>pe = PeoPle('Red')<br>print "Object print is: %s" %pe.color ## __init__会影响对象的属性<br>print "Class print is: %s" %PeoPle.color ## 类不会受__init__的影响<br></span>
|
类的继承:
单类继承
1
|
<span style = "font-family:'宋体', SimSun;font-size:12px;" > #!/usr/bin/python<br>class PeoPle(object):<br> color = 'Black'<br> def __init__(self,c): ## 初始化参数<br> self.color = c<br> print "Init runinng ......"<br> @classmethod ## 装饰方法,使其对象和类都可以调用<br> def fun1(self):<br> print "Color is: %s" % self.color<br>class MyClass(PeoPle): ## 继承父类PeoPle <br> color = 'MyClass'<br> def __init__(self):<br> PeoPle.__init__(self.'Red') ## 表示继承父类的__init__构造函数。 <br> @classmethod<br> def fun1(self):<br> print "This is MyClass the function"<br> pass<br>my=MyClass() ## 由于MyClass类中继承过PeoPle里的__init__参数。<br>print MyClass.color ## 优先返回MyClass里的属性<br>my.fun1() ## 优先返回MyClass里的方法<br>PeoPle.fun1() ## 返回PeoPle里的fun1方法<br>MyClass.fun1() ## 返回MyClass里的fun1方法<br>pe = PeoPle('Green') ## 由于PeoPle初始化__init__那里需要俩个参数,所以这里要加一个参数<br>print "Object print is: %s" % pe.color ## 打印初始化后对象的属性即Green<br>print "Class print is: %s" % PeoPle.color ## 打印类属性即Black <br></span>
|
多类继承:
1
|
<span style = "font-family:'宋体', SimSun;font-size:12px;" > #!/usr/bin/python<br>class PeoPle(object):<br> def __init__(self):<br> self.dwell = 'Earth'<br> self.color = 'Yellow'<br> def think(self):<br> print "I dwell am %s!" % self.dwell<br>class Chinese(object):<br> color = 'Black'<br> def __init__(self):<br> self.dwell = 'China'<br> def think(self):<br> print "I am chinese %s " % self.color<br>class MyClass(Chinese,PeoPle): ## 默认首先继续第一个类的属性跟方法 <br> def __init__(self): <br> PeoPle.__init__(self) ## 表示使用指定类的属性<br> pass<br>my = MyClass()<br>my.think() ## 返回I am Chinese Yellow<br></span>
|
类的属性---总结
-
类属性(公有属性): 可以在类中使用,相当于变量。
-
类私有属性(私有属性): 只能函数中使用,无法被对象调用
-
对象的公有属性: 对象可以调用
-
对象的私有属性: 只能类中调用
-
内置属性:
-
函数的局部变量: 只能在本函数中使用
-
函数的全局变量: 可以在类中所有的函数里使用
1
|
<span style = "font-family:'宋体', SimSun;font-size:12px;" > #!/usr/bin/python<br># coding:utf8<br>val6 = "全局变量"<br>print '*' * 50<br>class My(object):<br> val1 = "类的公有属性 val1"<br> __val2 = "类的私有属性 __val2"<br> def fun(self):<br> self.val3 = "对象的公有属性 val3"<br> self.__val4 = "对象的私有属性 __val4"<br> val5 = "函数的局部变量,只能在本函数使用"<br> global val6<br> val6 = "函数的全局变量,可以在类中所有的函数中使用"<br> def fun1(self):<br> print val6<br>my = My()<br>print my.val1<br>print my._My__val2<br>my.fun()<br>print '*' * 50<br>my.fun1()<br></span>
|
类的方法总结:
-
公有方法:
-
私有方法:
-
类方法:
-
静态方法:
-
内置方法:
1
|
<span style = "font-family:'宋体', SimSun;font-size:12px;" > #!/usr/bin/python<br>#-*- coding:utf8 -*_<br>class MyClass(object):<br> name = 'Warning'<br> def __init__(self):<br> self.fun1()<br> self.__fun2()<br> self.fun3()<br> self.fun4()<br> def fun1(self):<br> print "%s %s" % (self.name,'我是公有方法')<br> def __fun2(self):<br> print "%s %s" % (self.name,'我是私有方法')<br> @classmethod<br> def fun3(self):<br> print "%s %s" % (self.name,'我是类方法')<br> @staticmethod<br> def fun4():<br> print "%s %s" % (MyClass.name,'我是静态方法')<br>my = MyClass()<br>my.fun1() ## 调用公有方法<br>MyClass.fun3() ## 调用类方法<br>MyClass.fun4() ## 调用静态方法,注意静态方法不需要self,与类方法的区别<br></span>
|