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有异曲同工之妙都是指的当前对象,可以用来在构造函数中给实例属性初始化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容