面向对象

面向对象两个基本概念

定义了一件事物的抽象特点
对象 类的一个实例

类的特性:
-封装
-继承
-多态

定义类
class Programer(object):
1.定义类的属性
#直接定义
class Programer(object):
    hobby = "play computer"

per = Programer()#实例化一个类
print(per.hobby)
>>paly computer
#使用构造函数定义
class Programer(object):
    def __init__(self, name, age, weight):
        self.name = name #共有属性
        self._age = age #私有属性,但也可以访问
        self.__weight = weight #类自身内部可以访问,如下面get_weight函数中,但实例化类不可直接访问
    def get_weight(self):
        return self.__weight

per = Programer('gavin', 25, 70)
#print(dir(per)) #dir函数可以列出对象全部属性
print(per.name)
print(per._age)
#print(per.__weight) #这种写法无法访问到,即实例化类不可直接访问
print(per._Programer__weight) #查看print(dir(programer))结果可知programer有的是_Programer__weight属性
print(per.get_weight()) #类自身内部访问
>>gavin
>>25
>>70
>>70
2.定义类的方法(方法也可以看成是属性)

-函数 直接用函数名调用
-方法 须和对象联系在一起,是类的一部分

方法的定义和前面属性一样,另外还有两种关于方法的装饰器
@classmethod 调用的时候直接用类名,而不是某个对象
@property 像访问属性一样调用方法

class Example(object):
    def TestA(self):
        print("公有方法")

    def _TestB(self):
        print("私有方法")

    def __TestC(self):
        print("不可直接调用")


    @classmethod
    def TestD(self):
        print("直接调用类名")

    @property
    def TestE(self):
        print("像访问属性一样")

if __name__ == "__main__":
    exam = Example()
    exam.TestA()
    exam._TestB()
    #exam.__TestC() #这样写无法访问
    exam._Example__TestC()
    Example.TestD()  #调用的时候直接用类名
    exam.TestE  #像访问属性一样调用方法
>>共有方法
>>私有方法
>>不可直接调用
>>直接调用类名
>>像访问属性一样
类的继承

子类会继承父类的属性和方法
也可以自己定义,覆盖父类的属性和方法,不会影响其他继承父类的子类

-用Super()调用父类的方法(推荐,体现了继承):

class A(object):
    def methodA(self, arg):
        pass
class B(A):
    def methodB(self, arg):
        super(B, self).methodA(arg)

-用父类名调用父类方法:

class A(object):
    def methodA(self, arg):
        pass
class B(A):
    def methodB(self, arg):
        A.methodA(arg)

类的类型判断:
isinstance #判断是否实例
issubclass #判断是否子类

多继承

class DerivedClassName(Base1, Base2, Base3):
    pass
类的多态

多态的要素:
-继承
-方法重写

类的继承和多态栗子

#coding: utf-8

class Programer(object):
    hobby = 'Play Computer'

    def __init__(self, name, age, weight):
        self.name = name  #可公开访问
        self._age = age   #表私有属性,但也是可以访问的
        self.__weight = weight   #类自身内部可以访问,如下面get_weight函数中,但实例化类不可直接访问,如下

    def get_weight(self):
        return self.__weight

    def introduce(self):
        print('I am {},{} years old'.format(self.name, self._age))

class BackendProgramer(Programer): #类的继承
    def __init__(self, name, age, weight, language):
        super(BackendProgramer, self).__init__(name, age, weight)
        self.language = language

    def introduce(self):#重写类的方法

        print('I am %s\nMy favorite language is %s'%(self.name, self.language))

def introduce(programer):
    if isinstance(programer, Programer):#判断programer是否实例Programer
        programer.introduce()

if __name__ == '__main__':
    per = Programer('gavin', 25, 70)
    backper = BackendProgramer('小明', 30, 75, 'python')
    #print(dir(per))  #dir函数查看属性
    #print(dir(backper))  #可以看到和上面的属性一样,多了language属性
    introduce(per)
    introduce(backper)
>>I am gavin,25 years old
>>I am 小明
>>My favorite language is python
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值