Python面向对象特性(类、继承、多态)

类和实例

类是创建实例的模板,实例则是一个一个具体的对象
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
Python允许对实例变量绑定任何数据

定义类
class Student(object):
    pass
#object 该类从哪个类中继承
#Student类名

创建实例
>>> bart = Student()

创建属性
class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

#注意__init__”前后分别有两个下划线

数据封装

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def print_score(self):
        print('%s: %s' % (self.name, self.score))

>>> bart.print_score()
Bart Simpson: 59

访问权限

Python本身没有任何机制阻止你干坏事,一切全靠自觉。

实例变量可以是:
xx 普通变量
__xx__ 特殊变量
__xx 私有变量  (其实外部也可以访问,看解释器解释)
_xx 这么命名是希望被视为私有变量

想让内部属性不被外部调用,在属性名称前加两个下划线
class Student(object):
    def __init__(self, name, score):
        self.__name = name
        self.__score = score
        
    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))
        
    def get_name(self):
        return self.__name

    def get_score(self):
        return self.__score

    def set_score(self, score):
        self.__score = score

继承和多态

可以使子类获得父类的全部功能
class Animal(object):
    def run(self):
        print('Animal is running...')
        
class Dog(Animal):
    pass

class Cat(Animal):
    pass

dog = Dog()
dog.run()

cat = Cat()
cat.run()

Animal is running...
Animal is running...
可以对代码做改进,即多态
子类的方法会覆盖父类
class Dog(Animal):

    def run(self):
        print('Dog is running...')

class Cat(Animal):

    def run(self):
        print('Cat is running...')

再次运行可得结果
Dog is running...
Cat is running...
判断一个变量是否是某个类型可以用isinstance()判断:
b = Animal() # b是Animal类型
>>> isinstance(b, Animal)
True

多态例子进阶

定义一个函数,传入不同类
def run_twice(animal):
    animal.run()
    animal.run()

>>> run_twice(Animal())
Animal is running...
Animal is running...

>>> run_twice(Dog())
Dog is running...
Dog is running...

对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。

开闭”原则:
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

获取对象信息

判断对象类型方法

使用type()
返回对应的Class类型

使用isinstance()
>>> h = Husky()
>>> isinstance(h, Husky)
True

使用dir()
获得一个对象的所有属性和方法
返回一个包含字符串的list
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

实例属性和类属性

给实例绑定属性
class Student(object):
    def __init__(self, name):
        self.name = name
        
给类绑定属性
class Student(object):
    name = 'Student'
 
属性归类所有,类的所有实例都可以访问到

在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值