面向对象编程2

动态方法与静态方法

动态方法

# 1.绑定给对象的方法


class Programmer:

    def run(self):
        print(self)


Programmer.run('app')  # app
# 对象调用绑定给对象的方法:自动将对象当做第一个参数传入
obj1 = Programmer()
obj1.run()


# 2. 绑定给类的方法


class Programmer:
    @classmethod
    def delete(cls):
        print(cls)


# 类调用绑定给类的方法:自动将类当做第一个参数传入
print(Programmer)  # <__main__.Programmer object at 0x0000000001EB8358>
Programmer.delete()  # <class '__main__.Programmer'>
# 对象调用绑定给类的方法:也不需要传参,会将产生该对象的类自动当做第一个参数传入
obj1 = Programmer()  # <class '__main__.Programmer'>
obj1.delete()  # <class '__main__.Programmer'>

静态方法

class Programmer:
    @staticmethod
    def debug(a):
        print(f'正在调试{a}')


# 1.普通的函数: 不管怎么调用,都必须传固定的参数
# 类调用静态方法:要自己传值
Programmer.debug('app')
# 对象调用静态方法:要自己传值
obj1 = Programmer()
obj1.debug('a shop app')

面向对象的三大特性之一:继承

面向对象有三大特性:继承、封装、多态

继承的含义

现实生活中继承是用来描述人与人之间资源的从属关系
eg:子女继承父母的财产,土地
面向对象中继承则是用来描述类与类之间数据的从属关系
eg:类A继承了类B,类A就可以调用类B中所有的数据和功能

继承的目的

现实生活中通过继承可以快速的积累财富,并且可以继承多人的财产
面向对象中通过继承可以减少代码冗余,提升开发效率,同样也可以多继承

继承的基本使用

class A(B):
pass
我们将被继承的类称为:父类或者基类
继承的类称为:子类或者派生类
python中一个类可以同时继承多个父类
class A(B,C,D,E):
pass

继承的本质

在面向对象编程中,类继承父类能减少代码冗余

class Programmer:
    def __init__(self, name, age, gender, salary):
        self.name = name
        self.age = age
        self.gender = gender
        self.salary = salary


class Java_programmer(Programmer):
    def work(self):
        print(f'{self.name}正在加班')


class python_programmer(Programmer):
    def resign(self):
        print(f'{self.name}被裁员了')


programmer_one = python_programmer('jackson', 35, 'male', 60000)
print(programmer_one.__dict__)  # {'name': 'jackson', 'age': 35, 'gender': 'male', 'salary': 60000}
programmer_one.resign()  # jackson被裁员了

属性查找

不继承的情况下

名字的查找顺序是:
先从对象自己的名称空间中查找,找不到再去类里面的名称空间查找
对象--->类

单继承的情况下

名字的查找顺序是:
先从对象自己的名称空间中查找,没有就去产生对象的类中查找
还没有并且类有父类则去父类中查找
对象--->类--->父类

class A:
    def f1(self):
        print('from A.f1')

    def f2(self):
        print('from A.f2')
        self.f1()

    def f3(self):
        print('from A.f3')
        self.f2()


class MyClass(A):
    def f1(self):
        print('from MyClass.f1')

    def f2(self):
        print('from MyClass.f2')


obj = MyClass()
obj.f3()  # from A.f3 from MyClass.f2

派生类

class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


class Boss(Person):
    def __init__(self, name, age, gender, level, salary):
        # 用了Person类里面的__init__方法之后
        # super(Boss,self).__init__(name,age,gender)  # 子类调用父类的方法,完整语法
        super().__init__(name, age, gender)  # 子类调用父类的方法,精简语法
        # 子类还可以添加额外的数据
        self.level = level
        self.salary = salary


class Staff(Person):
    def __init__(self, name, age, gender, staff_id, staff_age):
        # 用了Person类里面的__init__方法之后
        super().__init__(name, age, gender)
        # 子类还可以添加额外的数据
        self.staff_id = staff_id
        self.staff_age = staff_age


b1 = Boss('musk', 40, 'male', '10', 0)
s1 = Staff('jerry', 28, 'female', 1001, 8)
print(b1.__dict__)  # {'name': 'musk', 'age': 40, 'gender': 'male', 'level': '10', 'salary': 0}
print(s1.__dict__)  # {'name': 'jerry', 'age': 28, 'gender': 'female', 'staff_id': 1001, 'staff_age': 8}
posted @ 2022-04-07 23:53  一梦便是数千载  阅读(25)  评论(0编辑  收藏  举报