1.类的属性
成员变量
对象的创建
创建对象的过程称之为实例化,当一个对象被创建后,包含三个方面的特性对象聚丙属性和方法,
句柄用于区分不同的对象,
对象的属性和方法,与类中的成员变量和成员函数对应,
obj = MyClass()创建类的一个实例,扩号对象,通过对象来调用方法和属性
类的属性
类的属性按使用范围分为公有属性和私有属性类的属性范围,取决于属性的名称,
**共有属性**---在内中和内外都能够调用的属性
**私有属性**---不能在内外贝类以外函数调用
定义方式:以"__"双下划线开始的成员变量就是私有属性
可以通过instance.__classname__attribute方式访问,
内置属性--由系统在定义类的时候默认添加的由前后双下划线构成,如__dic__,__module__
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
ren = People()
ren.color = '白色人'
print ren.color
ren.think()
print '#'*30
print("People.color")
print ren.__People__age ##测试时使用。如要调用 时,通过方法内调用 。
2.类的方法
成员函数
类的方法
方法的定义和函数一样,但是需要self作为第一个参数.
类方法为:
公有方法
私有方法
类方法
静态方法
公有方法:在类中和类外都都测调用的方法.
私有方法:不测被类的外部调用模块,在方法前加个“__”c双下划线就是私有方法。
self参数:
用于区分函数和类的方法(必须有一个self)
self参数表示执行对象本身
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def test(self):
self.think() # 内部调用
jack = People()
jack.test() #外部调用
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
def test(self):
self.__talk() # 内部调用talk()
jack = People()
jack.test() #外部调用
类方法
类方法:被classmethod()函数处理过的函数,能被类所调用,也能被对象所调用(是继承的关系)。
静态方法:相当于“全局函数”,可以被类直接调用,可以被所有实例化对象共享,通过staticmethod()定义静态方法, 静态方法没有self参数
装饰器:
@classmethod()
@staticmethod()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
def test(self):
print 'Testing....'
cm = classmethod(test)
jack = People()
People.cm()
通过类方法类内的方法 ,不涉及的属性和方法 不会被加载,节省内存,快。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
def test(): ##没有self 静态调用 会把所有的属性加载到内存里。
print People.__age # 通过类访问内部变量
sm = staticmethod(test)
jack = People()
People.sm()
装饰调用类的方法:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
@classmethod #调用类的方法
def test(self):
print ("this is class method")
@staticmethod #调用类的方法
def test1():
print ("this is static method")
jack = People()
People.test()
People.test1()
3.类的内置方法
Python内部类:
所谓内部类,就是在类的内部定义的类,主要目的是为了更好的抽象现实世界。
例子:
汽车是一个类,汽车的底盘轮胎也可以抽象为类,将其定义到汽车内中,而形成内部类,
更好的描述汽车类,因为底盘轮胎是汽车的一部分。
内部类实例化方法:
方法1:直接使用外部类调用内部类
方法2:先对外部类进行实例化,然后再实例化内部类
out_name = outclass_name()
in_name = out_name.inclass_name()
in_name.method()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
class Chinese(object):
print("I am chinese")
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
@classmethod #调用类的方法
def test(self):
print ("this is class method")
@staticmethod #调用类的方法
def test1():
print ("this is static method")
jack = People.Chinese()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
class Chinese(object):
name ="I am a Chinese."
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
@classmethod #调用类的方法
def test(self):
print ("this is class method")
@staticmethod #调用类的方法
def test1():
print ("this is static method")
jack = People.Chinese() #外部类调用内部类
print jack.name #外部类调用内部类对象
另一种方法,外部类调用内部类对象
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
class Chinese(object):
name ="I am a Chinese."
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
@classmethod #调用类的方法
def test(self):
print ("this is class method")
@staticmethod #调用类的方法
def test1():
print ("this is static method")
ren = People() #实例化外部类
jack = ren.Chinese() #实例化内部类
print jack.name #打印内部类属性
或
print People.Chinese.name
print People.Chinese().name
魔术方法:
str(self)
构造函数与析构函数
构造函数:
用于初始化类的内部状态,Python提供的构造函数是__init__():
__init__():方法是可选的,如果不提供,python会给出一个默认的__init__方法。
析构函数:
用于释放对象占用的资源,python提供的析构函数是__del__():
__del__():也是可选的,如果不提供,则python会在后台提供默认析构函数。
构造函数__str__
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
class Chinese(object):
name ="I am a Chinese."
def __str__(self):
return "This is People class"
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
@classmethod #调用类的方法
def test(self):
print ("this is class method")
@staticmethod #调用类的方法
def test1():
print ("this is static method")
ren = People() #实例化外部类
print ren #默认执行__str__
__init__(self)初始化类:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
class Chinese(object):
name ="I am a Chinese."
def __str__(self):
return "This is People class"
def __init__(self,c='white'): #类实例化时自动执行
self.color = c
self.think()
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
@classmethod #调用类的方法
def test(self):
print ("this is class method")
@staticmethod #调用类的方法
def test1():
print ("this is static method")
jack = People('green')
ren = People() #实例化外部类
print ren.color #通过对象访问属性是初始化后的值
print People.color #通过类访问还是原来的值
[root@localhost 20180110]# python test1.py
I am a black
I am a thinker
30
black
yellow
析构函数__del__():释放资源
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
class Chinese(object):
name ="I am a Chinese."
def __str__(self):
return "This is People class"
def __init__(self,c='white'): #类实例化时自动执行
print ("initing...")
self.color = c
self.think()
f = open('test.py')
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
@classmethod #调用类的方法
def test(self):
print ("this is class method")
@staticmethod #调用类的方法
def test1():
print ("this is static method")
def __del__(self):
print ("del....")
self.f.close()
jack = People('green')
ren = People() #实例化外部类
print ren.color #通过对象访问属性是初始化后的值
print People.color #通过类访问还是原来的值
垃圾回收机制:
Python采用垃圾回收机制来清理不再使用的对象;python提供gc模块释放不再使用的对象。
Python采用“引用计数”的算法方式来处理回收,即:当然某个对象在其作用域内不再被其
他对象引用的时候,python就自动化清除对象。
gc模块collect()可以一次性收集所有待处理的对象(gc.collect)
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
__age = 30 #私有属性
class Chinese(object):
name ="I am a Chinese."
def __str__(self):
return "This is People class"
def __init__(self,c='white'): #类实例化时自动执行
print ("initing...")
self.color = c
self.think()
f = open('test.py')
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
print self.__age
def __talk(self):
print "I am talking with Tom"
@classmethod #调用类的方法
def test(self):
print ("this is class method")
@staticmethod #调用类的方法
def test1():
print ("this is static method")
def __del__(self):
print ("del....")
self.f.close()
print gc.collect() 如果是0是没有回收的。
jack = People('green')
ren = People() #实例化外部类
print ren.color #通过对象访问属性是初始化后的值
print People.color #通过类访问还是原来的值
4.类的继承
类的继承
继承是面向对象的重要特性之一,
继承关系继承是相对两个类而言的父子关系
子类继承了父类的所有公有属性和方法,
继承,实现了代码重用
使用继承
继承可以重用已经存在的数据和行为,减少代码的重复编写,
Python在类名后使用一对括号来表示继承关系,括号中的即类为父类
class Myclass(ParentClass),
如果父类定义了__init__方法,子类必须显式调用父类的__init__方法,
ParentClass.__init__(self,[args...])
如果子类需要扩展父类的行为,可以添加__init__方法的参数.
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
def think(self):
self.color = "black"
print "I am a %s " % self.color
print ("I am a thinker")
class Chinese(People):
pass
cn = Chinese()
print cn.color
cn.think()
父类中有构造函数:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
def __init__(self):
print "Init..."
self.dwell = 'Earth'
def think(self):
print "I am a %s " % self.color
print ("I am a thinker")
class Chinese(People):
pass
cn = Chinese()
print cn.dwell
cn.think()
参数大于两个:
Super 函数
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
def __init__(self,c):
print "Init..."
self.dwell = 'Earth'
def think(self):
print "I am a %s " % self.color
print ("I am a thinker")
class Chinese(People):
def __init__(self):
People.__init__(self,'red')
pass
cn = Chinese()
class A(object):
def __init__(self):
print "enter A"
print "leave A"
class B(object):
def __init__(self):
print "enter B"
super(B,self),__init__()
print "leave B"
b = B()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
def __init__(self,c):
print "Init..."
self.dwell = 'Earth'
def think(self):
print "I am a %s " % self.color
print ("I am a thinker")
class Chinese(People):
def __init__(self):
super(Chinese,self).__init__('red')
pass
cn = Chinese()
cn.think()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
def __init__(self,c):
print "Init..."
self.dwell = 'Earth'
def think(self):
print "I am a %s " % self.color
print ("I am a thinker")
class Chinese(People):
def __init__(self):
super(Chinese,self).__init__('red')
def talk(self):
print "I like taking."
cn = Chinese()
cn.think()
cn.talk()
多重继承
Python支持多重继承,第一个类可以继承多个父类
语法:
class class_name(Parent_c1,Parent_c2,...)
注意:
当父类中出现多个自定义的__init__的方法时,
多重继承,只执行第一个累的__init_方法,其他不执行。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
color = 'yellow'
def __init__(self):
print "Init..."
self.dwell = 'Earth'
def think(self):
print "I am a %s " % self.color
print ("My home is %s ") % self.dwell
class Martian(object):
color = 'red'
def __init__(self):
self.dwell = 'Martian'
class Chinese(People,Martian):
def __init__(self):
People.__init__(self)
cn = Chinese()
cn.think()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class People(object):
def __init__(self):
self.dwell = 'Earth'
self.color = 'yellow'
def think(self):
print "I am a %s " % self.color
print ("My home is %s ") % self.dwell
class Martian(object):
color = 'red'
def __init__(self):
self.dwell = 'Martian'
def talk(self):
print "I like talking"
class Chinese(Martian,People):
def __init__(self):
People.__init__(self)
cn = Chinese()
cn.think()
cn.talk()
5.类的属性总结
类属性,也是公有属性,
类的私有属性,
对象的共有属性,
对象的私有属性,
内置属性,
函数的局部变量,
全局变量,
#/usr/bin/env python
# -*- coding:utf-8 -*-
class MyClass(object):
var1 = '类属性,类的公有属性 var1'
__var2 = '类的私有属性 __var2'
def func1(self):
self.var3 = '对象的公有属性 var3'
self.__var4 = '对象的私有属性 __var4'
var5 = '函数的局部变量'
mc = MyClass()
mc.func1() #调用后才测打印出var3
print mc.var1
print mc._MyClass__var2
print mc.var3
mc1 = MyClass()
# mc1.func1() #mc1没有调用方法
print mc1.var3
通过类访问:
#/usr/bin/env python
# -*- coding:utf-8 -*-
# @time :2018/1/2 21:06
# @Author :FengXiaoqing
# @file :__init__.py.py
#
var6 = '全局变量 '
class MyClass(object):
var1 = '类属性,类的公有属性 var1' ##定义在方法外
__var2 = '类的私有属性 __var2'
def func1(self):
self.var3 = '对象的公有属性 var3' ##定义在方法内
self.__var4 = '对象的私有属性 __var4'
var5 = '函数的局部变量'
def func2(self):
print self.var1
print self.__var2
print self.var3
print self.__var4
print self.var6
mc = MyClass()
mc.func1()
mc.func2()
print '*'*50
print mc.__dict__
print MyClass.var1
#print MyClass.__var2 #不测通过类访问
print mc.var3 #对象的属性只能通过对象来访问
#print MyClass.__var4
print MyClass.__dict__
4.类的方法总结
公有方法
私有方法
类方法
静态方法
内置方法
class MyClass(object):
name = 'Test'
def func1(self):
print self.name,
print "我是公有方法."
self.__func2() #func1间接调用了func2的私有方法
def __func2(self):
print self.name,
print "我是私有方法."
def classFun(self):
print self.name,
print "我是类方法."
def staticFun(self):
print s.name,
print "我是静态方法."
mc = MyClass()
mc.func1()
@classmethod
def classFun(self):
print self.name,
print "我是类方法."
def staticFun(self):
print s.name,
print "我是静态方法."
mc = MyClass()
mc.func1()
MyClass.classFun()
用类方法:用装饰器
调用静态方法:
@staticmethod
def staticFun():
print MyClass.name,
print "我是静态方法."
mc = MyClass()
mc.func1()
MyClass.classFun()
MyClass.staticFun()
调用内置方法:
class MyClass(object):
name = 'Test'
def __init__(self):
self.func1()
self.__func2()
self.classFun()
self.staticFun()
def func1(self):
print self.name,
print "我是公有方法."
def __func2(self):
print self.name,
print "我是私有方法."
@classmethod
def classFun(self):
print self.name,
print "我是类方法."
@staticmethod
def staticFun():
print MyClass.name,
print "我是静态方法."
mc = MyClass()