Python-面向对象(三)

1. 继承简介

继承是面向对象三大特性之一。
通过继承我们可以使一个类获取到其他类中的属性和方法。
在定义类时,可以在类名后面的括号中指定当前类的父类(超类、基类)。
继承提高了类的复用性,让类与类之间产生了关系,有了这个关系,才有了多态的特性。

class Animal:
    def run(self):
        print('动物跑.....')
    def sleep(self):
        print('动物睡觉....')
     def speak(self): 
         print('旺旺.....')
 class Dog(Animal):
    def speak(self):
        print('旺旺.....')
 a = Animal()
 a.run()
 d = Dog()
  print(d)
  d.run()
  d.sleep()
  d.speak()
 r = isinstance(d,Dog)
 r = isinstance(d,Animal)
 print(r)
 #在创建类时,如果省略了父类,则默认父类为object
 #object是所有类的父类,所有类都继承自object
 #所有的对象都是object的实例
 class Person(object):
     pass
 issubclass()#检查一个类是否是另一个类的子类
 print(issubclass(Dog,Animal)) True
 print(issubclass(Person,object)) True
 r = issubclass(len,object)
 print(r)
 print(issubclass(print(),object))

2. 方法重写

如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们称之为方法的重写(覆盖)。
当我们调用一个对象的方法时:
会优先去当前对象中寻找是否具有该方法,如果有则直接调用;如果没有则去当前对象的父类中寻找;如果父类中有则直接调用父类中的方法;如果没有则去父类中的父类寻找,以此类推直到找到object,如果依然没有找到就报错了。

class A(object):
    def test(self):
        print('A....')
class B(A):
    def test(self):
        print('B....')
class C(B):
    def test(self):
        print('C....')
c = C()
c.test()
c.speak() # AttributeError: 'C' object has no attribute 'speak'

3. super()

super()可以获取当前类的父类。
通过super()返回对象调用父类方法时,不需要传递self。

class Animal:
    def __init__(self,name):
        self._name = name
    def run(self):
        print('动物跑.....')
    def sleep(self):
        print('动物睡觉....')
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self,name):
        self._name = name
# 父类中所有的方法都会被子类继承,包括特殊方法
class Dog(Animal):
    def __init__(self,name,age):
        # 希望可以直接调用父类的__init__
        # 我希望有一种动态的方式来获取类的父类
        # Animal.__init__(self,name)
        # 通过super()可以直接获取当前类的父类
        super().__init__(name)
        # self._name = name
        self._age = age
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self,age):
        self._age = age
    def run(self):
        print('狗跑.....')
    def speak(self):
        print('旺旺.....')
d = Dog('二哈',8) # __init__() missing 1 required positional argument: 'name'
d.name = '德牧'
print(d.name)
print(d.age)

4. 多重继承

在Python中是支持多重继承的。
我们可以为一个类同时制定多个父类,可以在类名的()中添加多个类,来实现多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法。
在开发中没有特殊情况,应该尽量避免使用多重继承,因为多重继承会让我们的代码更加复杂。
如果多个父类中有同名的方法,则会先在第一个父类中寻找,然后找第二个,找第三个…前面会覆盖后面的。

# __bases__ 可以获取当前类所有的父类
# 用法 类名.__bases__
class A(object):
    # def test(self):
    #
    #     print('A....')
    pass
class B(object):
    def test(self):
        print('B中的test方法...')
    def test2(self):
        print('B....')
class C(A,B):
    # def test3(self):
    #     print('C....')
    pass
# print(C.__bases__)
c = C()
c.test()

5. 多态

多态是面向对象的三大特性之一。
从字面理解就是多种形态一个对象可以以不同形态去呈现。
面向对象三大特性:
封装 确保对象中数据的安全
继承 保证了对象的扩展性
多态 保证了程序的灵活性

class A:
    def __init__(self,name):
        self._name = name
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self,name):
        self._name = name
class B:
    def __init__(self,name):
        self._name = name
    def __len__(self):
        return 100
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self,name):
        self._name = name
class C:
    pass
a = A('葫芦娃')
b = B('钢铁侠')
c = C()
# 对应speak()这个函数来说,只要对象中函数有name属性,它就可以作为参数传递
# 这个函数并不考虑对象的类型。只要有name属性就可以
def speak(obj):
    print('你好 %s'%obj.name)
# 在speak2()中我们做了一个类型检查,也就是只有符合obj是A类型的对象时,才可以使用
# 其他类型的对象使用不了该函数。这个函数就违反了多态
def speak2(obj):
    # 检查
    if isinstance(obj,A):
        print('你好 %s' % obj.name)
# speak(c)
# speak2(b)
# len() 获取长度 是因为这个对象中有一个特殊方法__len__
# 只要对象中有__len__特殊方法,就可以通过len()这个函数获取长度
# lst = [1,2,3]
# s = 'python'
# print(len(lst))
# print(len(s))
print(len(b)) # TypeError: object of type 'B' has no len()

6. 属性和方法

属性
类属性,直接在类中定义的属性是类属性
类属性可以通过类或类的实例访问到,但是类属性只能通过类对象来修改,无法通过实例对象修改实例属性。
通过实例对象添加的属性属于实例属性
实例属性只能通过实例对象来访问和修改,类对象无法访问修改。
方法
在类中定义,以self为第一个参数的方法都是实例方法
实例方法在调用时,Python会将调用对象以self传入实例方法可以通过类实例和类去调用。当通过实例调用时,会自动将当前调用对象作为self传入;当通过类调用时,不会自动传递self,我们必须手动传递self。
类方法 在类的内容以@classmethod 来修饰的方法属性。
类方法第一个参数是cls 也会自动被传递。cls就是当前的类对象。
类方法和实例方法的区别:
实例方法的第一个参数是self,类方法的第一个参数是cls;
类方法可以通过类去调用,也可以通过实例调用。
静态方法在类中用@staticmethod来修饰的方法属于静态方法。
静态方法不需要指定任何的默认参数,静态方法可以通过类和实例调用。
静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数。
静态方法一般都是些工具方法,和当前类无关。

# 定义一个类
class A(object):
    # 类属性 直接在类中定义的属性
    # 类属性可以通过类和类的实例访问到
    # 类属性只能通过类对象来修改,无法通过实例对象修改。
    count = 0
    def __init__(self):
        # 实例属性 通过实例对象添加的属性
        # 实例属性只能通过实例对象访问和修改,类对象无法访问和修改
        self.name = '葫芦娃'
    # 实例方法
    # 在类中定义,以self第一个参数的方法都是实例方法
    # 实例方法在调用的时候 Python会将调用对象以self传入
    # 当通过类去调用时,不会自动传递self,此时需要手动传递self
    def test(self):
        print('这是test方法......',self)
    # 类方法
    # 类方法和实例方法的区别:
     #实例方法第一个是参数self 
     #类方法第一个参数是cls
    # 而且类方法需要用@classmethod
    @classmethod
    def test_2(cls):
        print('这是test2方法 它是一个类方法...',cls)
        print(cls.count)
    #  @staticmethod  修饰的方法是静态方法
    # 静态方法不需要指定任何默认参数。静态方法可以通过类或者实例调用
    # 静态方法 基本上是一个和当前类无关的方法。它只是一个保存到当前类的函数
    # 静态方法一般都是一些工具方法,和当前类无关。
    @staticmethod
    def test_3():
        print('test3方法是一个静态方法')
a = A()
a.name = 'xxxx'
# b = A()
# a.count = 10
# A.count = 100
# print('A',A.count)
# print('a',a.count)
# print('a,',a.name)
# print('A',A.name) # AttributeError: type object 'A' has no attribute 'name'
# a.test()
# A.test(a) # TypeError: test() missing 1 required positional argument: 'self'
# a.test() 等价于 A.test(a)
# A.test_2()
# a.test_2()
# A.test_2() 等价于 a.test_2()
A.test_3()
a.test_3()
print()
max()
input()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值