Python----类

Python学习之路,点击有全套Python笔记

面向对象编程是最有效的软件编写方法之一。

在面向对象编程中,所编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。根据类来创建对象的过程叫实例化

类是对一系列具有相同特征或行为的事物的总称,是一个抽象的概念,不是真实存在的。

  • 特征即是属性
  • 行为即是方法

对象是类创建出来的真实存在的事物。
开发中,先有类,再有对象

1. 简单尝试

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

    def sit(self):
        print(self.name + '坐下了')

    def roll(self):
        print(self.name + "在打滚")

dog = Dog('哈哈','8')
print(dog.name)  # 哈哈
dog.sit()  # 哈哈坐下了
dog.roll()  # 哈哈在打滚
  • 关于 __init__:这是一个特殊的方法,当根据类创建新的实例时,Python会自动运行它。在刚刚的方法中,__init__有三个形参,其中第一个self是必须有也必须写在最前面的,后面两个是自己添加的。当调用这个方法来创建实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
    2. 给属性指定与修改默认值
  • 指定
class Dog():
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.speed = 0

    def sit(self):
        print(self.name + '坐下了')

    def roll(self):
        print(self.name + "在打滚")

    def run(self):
        print(f'这只狗今天走了{self.speed}里路')

dog = Dog('haha', '18')
dog.run()
  • 修改

修改有三种方法

  • 通过实例
  • 通过方法进行修改
  • 通过方法进行递增
# 通过实例修改
dog = Dog('haha', '18')
dog.run()
dog.speed = 23
dog.run()  # 这只狗今天走了23里路
# 通过方法进行修改
class Dog():
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.speed = 0

    def sit(self):
        print(self.name + '坐下了')

    def roll(self):
        print(self.name + "在打滚")
	
	# 新增方法
    def run(self):
        print(f'这只狗今天走了{self.speed}里路')

    def update_speed(self, num):
        if self.speed < num:
            self.speed = num
dog.update_speed(25)
dog.run()  # 这只狗今天走了25里路
# 通过方法对属性的值进行递增
class Dog():
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.speed = 0

    def sit(self):
        print(self.name + '坐下了')

    def roll(self):
        print(self.name + "在打滚")

    def run(self):
        print(f'这只狗今天走了{self.speed}里路')

    def update_speed(self, num):
        if self.speed < num:
            self.speed = num
	
	# 新增方法
    def add_speed(self, num):
        self.speed += num
dog.update_speed(25)
dog.run()  # 这只狗今天走了25里路
dog.add_speed(3)
dog.run()  # 这只狗今天走了28里路

3. 继承

当一个类继承另一个类时,将自动获得另一个类的所有属性和方法;原有的类称为父类,新类称为子类,子类继承了父类所有的方法,同时还可以定义自己的属性和方法。

但是子类无法继承父类的私有方法,支持多重继承

class Dog():
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.speed = 0

    def sit(self):
        print(self.name + '坐下了')

    def roll(self):
        print(self.name + "在打滚")

    def run(self):
        print(f'这只狗今天走了{self.speed}里路')

    def update_speed(self, num):
        if self.speed < num:
            self.speed = num

    def __shu(self):   # 私有属性就是前面加上两个_
        print('这是私有属性,继承不了')

    def add_speed(self, num):
        self.speed += num

class ErHa(Dog):  # ()内放入要继承的父类
    def __init__(self, name, age, spec):  # 接受实例所需的信息
        super().__init__(name, age)  #  # super是特殊函数,帮助父类与子类关联起来
        self.spec = spec  # 子类定义属性

    def spe(self):  # 给子类定义方法
        print(f'我的狗叫{self.name},今年{self.age}岁了,它很{self.spec}')
    def run(self):  # 重写父类方法
        print('他只知道拆家,不知道跑步')        
my_dog = ErHa('哈哈', '10', '顽皮')
my_dog.spe()  # 我的狗叫哈哈,今年哈哈,它很顽皮
my_dog.run()  # 他只知道拆家,不知道跑步

4. 私有继承

class Employee:
    def __init__(self, name, age):
        self.name = name
        self.__age = age            # 测试私有属性

    def __work(self):               # 测试私有方法
        print("hard work")

e = Employee("Tom", 18)

print(e.name)
print(e._Employee__age)  # 类外调用的方法:_类名__属性名
e._Employee__work()

5.多重继承

Python支持多重继承,一个子类可以有多个“直接父类”。这样就具备了“多个父类”的特点。但是由于这样会被“类的整体层次”搞的异常复杂,尽量避免使用。

class A:
    def __init__(self, name):
        self.name = name

    def aa(self):
        print(self.name)

class B:
    def __init__(self, age):
        self.age = age
    def bb(self):
        print(self.age)

class C(A, B):
    def __init__(self, name, age):
        super().__init__(name)
        B.__init__(self, age)

    def c(self):
        print(self.name+self.age)

c = C('jack','18')
c.c()  # jack18

6. 多态

多态是指同一个方法调用,由于对象不同可能会产生不同行为

  • 多态是方法的多态,属性没有多态
  • 多态的存在有两个必要条件:继承,方法重写
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

isinstance() 与 type() 区别:
    type() 不会认为子类是一种父类类型,不考虑继承关系。
    isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。

语法:
    isinstance(object, classinfo)
    
参数
    object -- 实例对象。
    classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
     
返回值
    如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
class Man:
    def __init__(self):
        pass
    def eat(self):
        print('饿了,吃饭饭')

class Chinese(Man):
    def __init__(self):
        super().__init__()
    def eat(self):
        print('饿了,用筷子吃饭')

class English(Man):
    def __init__(self):
        super().__init__()
    def eat(self):
        print('饿了,用叉子吃饭')

class India(Man):
    def __init__(self):
        super().__init__()
    def eat(self):
        print('饿了,用手吃饭')

def manEat(m):
    if isinstance(m, Man):
        m.eat()  # # 多态,一个方法调用,根据对象不同调用不同的方法
    else:
        print('不能吃饭')

manEat(Chinese())  # 饿了,用筷子吃饭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值