python自定义功能之面向对象

本章主要内容

  • 类与对象
  • 定义和使用类
  • 类的属性和方法
  • 类的继承
  • 类的方法重载
class myclass:
    "Myclass help."
Myclass = myclass()        # 将类实例化
print(myclass.__doc__)     # 输出类说明
help(myclass)              #输出类帮助信息
Myclass help.
Help on class myclass in module __main__:

class myclass(builtins.object)
 |  Myclass help.
 |  
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
class println:
    def __init__(self,x,y=0): #定义构造方法且初始化实例属性
        self.x = x
        self.y = y
    def func(self):
        return self.x*self.y
    def info(self):            #定义类方法
        print('定义类')
    def call(self,a,b):       
        return a + b
c = println(2,2)             #实例化类        
print(c.func())                    
c.info()
print(c.call(1,2))          #调用类方法
4
定义类
3
def num(x,y):            #定义全局函数
    return abs(x),abs(y)
class firstfun:
    def __init__(self,x=0,y=0): #定义构造方法
        self.x = x
        self.y = y
    def move(self,x,y):
        self.x,self.y = num(x,y)  #调用num函数
        self.point(self.x,self.y) #方法中调用方法
        self.printl(self.x,self.y)
    def point(self,x,y):
        self.x=x+1
        self.y=y+1
        print('x=%d,y=%d' % (x,y)) 
    def printl(self,x,y):
        print('x=%d,y=%d' % (x,y))
a = firstfun()                    #实例化对象
a.move(-1,5)                      #调用对象方法
x=1,y=5
x=2,y=6
#类的属性
'''
实例属性为某个实例化对象所特有
另外对象中的属性互不相关,类属
性为同一个类的实例化对象所共有
一旦改变所有对象中的类属性都会
改变
'''
class myclasspython:
    class_name = 'python'      #定义类属性为所有对象所共有
    def __init__(self,x=0):
        self.x = x+1             #实例属性
    def infor(self):               
        print('类属性为:%s,实例属性为:%d'%(myclasspython.class_name,self.x))
    def changev(self,x):        #改变实例属性的方法
        self.x = x             
    def changecn(self,name):     #改变类属性的方法
        myclasspython.class_name = name       
print('初始化实例变量')
a = myclasspython()
b = myclasspython()
a.infor()
b.infor()

print('修改a的实例变量后')
a.changev(6)
a.infor()
b.infor()
print('修改b的类属性后')
b.changecn('java')
print(a.class_name)
print(b.class_name)

初始化实例变量
类属性为:python,实例属性为:1
类属性为:python,实例属性为:1
修改a的实例变量后
类属性为:python,实例属性为:6
类属性为:python,实例属性为:1
修改b的类属性后
java
java
#类成员方法与静态方法
class DemoMthd:
    @staticmethod               #静态方法装饰器
    def static_mthd():          #静态类定义没有默认参数
        print('调用了静态方法')   
    @classmethod                #类方法装饰器
    def class_mthd(cls):        #类方法需加参数cls 
        print('调用了类方法') 
DemoMthd.static_mthd()         #未实例化对象通过类名调用静态与类方法
DemoMthd.class_mthd()
dm = DemoMthd()
dm.static_mthd()              #通过实例化对象调用静态与类方法
dm.class_mthd()
调用了静态方法
调用了类方法
调用了静态方法
调用了类方法
#类的继承
'''
子类要想覆盖父类的方法拥有自己的特性
只需要创建与父类方法同名的方法即可
'''
class Ant:
        def __init__(self,x=0,y=0,color='black'):
            self.x = x
            self.y = y
            self.color = color
        def crawl(self,x,y):
            self.x = x
            self.y = y
            print('爬爬.....')
            self.info()
        def info(self):
            print('当前位置:(%d,%d)'%(self.x,self.y))
        def attack(self):
            print('用嘴咬')
class flyant(Ant):                #flyant继承类Ant
    def attack(self):             #儿类覆盖父类方法
        print('发射尾针...')       
    def fly(self):
        print('飞呀飞呀我的骄傲放纵。。') #模拟蜜蜂飞行动作 
ant = Ant()                          #实例化蚂蚁
print(ant.color)
ant.crawl(3,4)
ant.attack()
FlyAnt = flyant()                   #实例化蜜蜂
FlyAnt.crawl(3,4)
FlyAnt.attack()
FlyAnt.fly()
black
爬爬.....
当前位置:(3,4)
用嘴咬
爬爬.....
当前位置:(3,4)
发射尾针...
飞呀飞呀我的骄傲放纵。。
# 多重继承
class A:
    name = '灭绝师太'   #定义类变量
    def set_age(self,age=88):
        self.age = age
    
    def set_KongFu(self,KongFu='峨眉剑法'):
        self.KongFu =KongFu
    def info(self):
        print('name=%s,age=%d,KongFu=%s'%(A.name,self.age,self.KongFu))
class B:
    name = '苏蓉蓉'
    def set_age(self,age=20):
        self.age = age
    def loveman(self,love='楚留香'):
        self.love = love
        print('蓉蓉爱%s'%(self.love))
    def set_KongFu(self,KongFu='易容术'):
        self.KongFu = KongFu
    def info(self):
        print('name=%s,age=%d,loveman=%s,KongFu=%s'%(B.name,self.age,self.love,self.KongFu))
class C(A,B):      #先继承A后继承B,AB若有同名的方法则A覆盖B
    pass
class C2(B,A):     #先继承B后继承A,AB若有同名的方法则B覆盖A
    pass
class C3(B,A):
    def info(self):  #继承A,B且覆盖A,B中的方法info
        A.info(self)
        B.info(self)
print('使用第一个子类:')      
CC = C()
CC.set_age()
CC.set_KongFu()
CC.loveman()
CC.info()
print('使用第二个子类:')
CC2 = C2()
CC2.set_age()
CC2.set_KongFu()
CC2.loveman()
CC2.info()
print('使用第三个子类:')
CC3 = C3()
CC3.set_age()
CC3.set_KongFu()
CC3.loveman()
CC3.info()
使用第一个子类:
蓉蓉爱楚留香
name=灭绝师太,age=88,KongFu=峨眉剑法
使用第二个子类:
蓉蓉爱楚留香
name=苏蓉蓉,age=20,loveman=楚留香,KongFu=易容术
使用第三个子类:
蓉蓉爱楚留香
name=灭绝师太,age=20,KongFu=易容术
name=苏蓉蓉,age=20,loveman=楚留香,KongFu=易容术

总结:

python中的类与对象与JAVA相比多了类的多重继承,把继承和接口融合成了一体,JAVA中之所以不允许多继承就在于要限制JAVA程序的规模,如果子类继承多个父类的话可能会造成代码规模过于庞大,不方便代码的维护。但是在python中不会发生这样的情况,因为python比JAVA更加的面向对象,python中有许多的内置函数可以使用这使得python的代码更加的简洁优美,不会造成代码量规模过于庞大,而且这也使得python语言更加的灵活多变。python中的self关键字与java中的 this有异曲同工之妙都是指的当前对象,可以用来在构造函数中给实例属性初始化。

你可能感兴趣的:(python自定义功能之面向对象)