08Python基础-类与对象

类和对象都是面向对象重要概念面向对象一种编程思想按照真实世界思维方式构建软件系统

比如现实学校学生老师学生学号姓名班级属性(数据)提问学习吃饭动作(方法)如果我们开发消炎管理系统会有学生老师“类”王同学刘同学学生个体成为“对象”

比如下图形象比喻

1.定义类

Python数据类型都是我们可以自定义创建一种数据类型

class 类名 [(父类)]:

    类体

备注父类可以省略声明表示直接继承object

class Car(object):

    # 类体

    pass # 维持程序结构完整临时占用

小汽车(Car)类继承了object类,object类是所有类的根类,在Python中任何一个类(除object外)都直接或间接地继承了object,直接继承object时(object)部分的代码可以省略。

创建对象

相当于一个模版依据这样模版创建对象就是实例化所以对象成为“实例”

class Car(object):

    # 类体

    pass # 维持程序结构完整临时占用

car = Car()

2.类的成员

成员变量称为数据成员保存对象数据

构造方法一种特殊函数用于初始化成员变量

成员方法类中定义函数

属性进行封装提供特殊方法

实例变量实例方法属于对象通过对象调用变量方法属于属于调用

a.实例变量

实例变量就是对象个体特有“数据”名字年龄

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/28 14:59
@File: leiandduix-a.py
@IDE: PyCharm
"""

class Cat:
    def __init__(self, name, age):
        self.name = name  # 创建和初始化实例变量name
        self.age = age  # 创建和初始化实例变量age

c = Cat('西西', 2)
print('这个猫的名字叫{0},{1}岁了。'.format(c.name, c.age))

b.构造方法

类中__init__()方法一个非常特殊方法用来创建初始化实例变量这种方法就是“构造方法”定义__init__()方法1参数应该self之后参数用来初始化实例变量调用构造方法不需要传入self参数

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/28 14:59
@File: leiandduix-b.py
@IDE: PyCharm
"""

class Cat:
    def __init__(self, name, age, sex='雌性'):
        self.name = name  # 创建和初始化实例变量name
        self.age = age  # 创建和初始化实例变量age
        self.sex = sex # 创建和初始化实例变量sex

c1 = Cat('西西', 2)          # 创建对象调用构造方法,省略默认值
c2 = Cat('钉钉', 1, '雌性')
c3 = Cat(name = '库库', sex='雄性', age=3)
print('这个猫的名字叫{0},{1}岁{2}。'.format(c1.name, c1.age, c1.sex))
print('这个猫的名字叫{0},{1}岁{2}。'.format(c2.name, c2.age, c2.sex))
print('这个猫的名字叫{0},{1}岁{2}。'.format(c3.name, c3.age, c3.sex))

c.实例方法

实例方法实例变量一样都是某个实例(或对象)个体特有方法

定义实例方法1参数也应该self这会当前实例方法绑定起来这样说明方法属于实例调用方法不需要传入self构造方法

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/28 14:59
@File: leiandduix-c.py
@IDE: PyCharm
"""


class Cat:
    def __init__(self, name, age, sex='雌性'):
        self.name = name  # 创建和初始化实例变量name
        self.age = age  # 创建和初始化实例变量age
        self.sex = sex  # 创建和初始化实例变量sex

    # 实例方法
    def run(self):
        print("{}在跑。。。".format(self.name))

    # 实例方法
    def speak(self, sound):
        print('{}在叫,"{}"'.format(self.name, sound))


cat = Cat('哈哈', 2)
cat.run()
cat.speak('喵~~')

d.类变量

变量属于变量不属于当个对象

有一个Account(银行账户)三个成员变量amountt(账户金额)、interest_rate(利率)和owner(账户名)。amount和owner对于每一个账户都是不同的,而interest_rate对于所有账户都是相同的。amount和owners是实例变量,interest_rate是所有账户实例共享的变量,它属于类,被称为“类变量”。

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/28 15:59
@File: leiandduix-d.py
@IDE: PyCharm
"""


class Account:
    interest_rate = 0.0568  # 类变量利率interset_rate

    def __init__(self, owner, amount):
        self.owner = owner
        self.amouont = amount


account = Account('Tony', 800000.0)
print('账户名:{0}'.format(account.owner))
print('账户金额:{0}'.format(account.amouont))
print('利率:{0}'.format(Account.interest_rate))

e.类方法

方法类变量类型属于不属于个体实例定义方法第1个参数不是self而是本身

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/28 15:59
@File: leiandduix-d.py
@IDE: PyCharm
"""

class Account:
    interest_rate = 0.0568  # 类变量利率interset_rate

    def __init__(self, owner, amount):
        self.owner = owner
        self.amount = amount

    # 类方法
    @classmethod      # 定义类方法需要的装饰器,装饰器以@开头修饰函数、方法和类,用来约束他们
    def interest_by(cls, amt):          # cls代表类自身,就是Account类
        return cls.interest_rate * amt  # cls可以直接使用Account替换,cls.interest_rate * amt也可以写成Account.interest_rate * amt

interest = Account.interest_by(12000.0)    # 对类的方法可以通过“类名.类方法”访问
print('计算利息:{0:.4f}'.format(interest))

3.封装性

封装性是面向对象重要的基本特性之一。封装隐藏了对象的内部细节,只保留有限的对外接口,外部调用者不用关心对象的内部细节,使得操作对象变得简单。

一台计算机内部极其复杂,有主板、CPU、硬盘和内存等,而一般人不需要了解它的内部细节。计算机制造商用机箱把计算机封装起来,对外提供了一些接口,如鼠标、键盘和显示器等,使用计算机就变得非常简单。

a.私有变量

为了防止外部调用者随意存取内部数据(成员变量)内部数据(成员变量)封装“私有变量”外部调用者职能通过方法调用私有变量

默认情况下python变量公有可以外边访问它们如果成为私有变量变量加上下划线“__”即可

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/29 11:43
@File: fengzhuang-a.py
@IDE: PyCharm
"""

class Account:
    __interest_rate = 0.0568  # 类变量利率,私有类变量

    def __init__(self, owner, amount):
        self.owner = owner
        self.__amount = amount       # 私有实例变量

    def desc(self):   # 在类的内部可以访问私有变量
        print("{0} 金额:{1} 利率:{2}。".format(self.owner, self.__amount, Account.__interest_rate))

account = Account('Maoge', 80000, 0)
account.desc()

print('账户名:{0}'.format(account.owner))
print('账户金额:{0}'.format(account.__amount))       # 会报错
print('利率:{0}'.format(Account.__interest_rate))   # 会报错

b.私有方法

私有方法变量封装类似方法前下划线__


# -*- coding: utf-8 -*-
"""
@Time: 2024/5/29 11:43
@File: fengzhuang-b.py
@IDE: PyCharm
"""

class Account:
    __interest_rate = 0.0568  # 类变量利率,私有类变量

    def __init__(self, owner, amount):
        self.owner = owner
        self.__amount = amount       # 私有实例变量

    def __get_info(self):
        return "{0} 金额:{1} 利率:{2}。".format(self.owner, self.__amount, Account.__interest_rate)

    def desc(self):   # 在类的内部调用私有方法
        print(self.__get_info())


account = Account('Maoge', 80000, 0)
account.desc()
account.__get_info()   # 会报错

由于外部可以访问私有方法所有运行报错

c.使用属性

为了实现对象的封装,在一个类中不应该有公有的成员变量,这些成员变量应该被设计为私有的,然后通过公有的set (赋值)和get(取值)方法访问。

使用set和get方法进行封装,

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/29 11:43
@File: fengzhuang-d.py
@IDE: PyCharm
"""


class Cat:

    # 构造方法
    def __init__(self, name, age, sex='雌性'):
        self.name = name
        self.__age = age

    # 实例方法
    def run(self):
        print("{}在跑。。。".format(self.name))

    # get方法
    def get_age(self):
        return self.__age

    # set方法
    def set_age(self, age):
        self.__age = age


cat = Cat('毛雪', 2)
print('猫的年龄:{}'.format(cat.get_age()))
cat.set_age(3)
print('修改后猫的年龄:{}'.format(cat.get_age()))

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/29 11:43
@File: fengzhuang-.py
@IDE: PyCharm
"""


class Cat:

    # 构造方法
    def __init__(self, name, age, sex='雌性'):
        self.name = name
        self.__age = age

    # 实例方法
    def run(self):
        print("{}在跑。。。".format(self.name))

    @property  # 定义age属性的get()方法,使用@property装饰器进行修饰,方法名就是属性名,即age
    def age(self):    # 替代get_age(self)
        return self.__age

    @age.setter
    def age(self, age):  # 替代set_age(self,age)
        self.__age = age


cat = Cat('毛雪', 2)
print('猫的年龄:{}'.format(cat.age()))
cat.age = 3  # cat.set_age(3)
print('修改后猫的年龄:{}'.format(cat.age()))

4.继承性

在现实世界中继承关系无处不在。例如猫与动物之间的关系:猫是一种特殊动物,具有动物的全部特征和行为,即数据和操作。在面向对象中动物是一般类,被称为“父类”;猫是特殊类,被称为“子类”。特殊类拥有一般类的全部数据和操作,可称之为子类继承父类。

a.Python继承

在Python中声明子类继承父类,语法很简单,定义类时在类的后面使用一对小括号指定它的父类就可以了

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/30 13:07
@File: jicheng-a.py
@IDE: PyCharm
"""

class Animal:

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

    def show_info(self):
        return "动物的名字:{0}".format(self.name)

    def move(self):
        print("动一下")

class Cat(Animal):

    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

cat = Cat('小黎', 3)
cat.move()
print(cat.show_info())

b.继承

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/30 13:12
@File: jicheng-b.py
@IDE: PyCharm
"""

class Hourse:
    def __init__(self,name):
        self.name = name # 实例变量

    def show_info(self):
        return "马的名字:{0}".format(self.name)

    def run(self):
        print("马动起来")

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

    def show_info(self):
        return "驴的名字:{0}".format(self.name)

    def run(self):
        print("驴动起来")

    def roll(self):
        print("驴打滚")

class Mule(Hourse,Donkey):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

m = Mule('骡子', 3)
m.run()         # 继承父类Horse方法
m.roll()        # 继承父类Donkey
print(m.show_info()) # 继承父类Horse方法

c.方法重写

如果子类的方法名与父类的方法名相同,则在这种情况下,子类的方法会重写(Override)父类的同名方法。

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/30 13:12
@File: jicheng-c.py
@IDE: PyCharm
"""

class Hourse:
    def __init__(self, name):
        self.name = name  # 实例变量

    def show_info(self):
        return "马的名字:{0}".format(self.name)

    def run(self):
        print("马动起来")

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

    def show_info(self):
        return "驴的名字:{0}".format(self.name)

    def run(self):
        print("驴动起来")

    def roll(self):
        print("驴打滚")

class Mule(Hourse, Donkey):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def show_info(self):  # 重新父类方法
        return "骡子:{0},{1}岁。".format(self.name, self.age)

m = Mule('骡子', 3)
m.run()  # 继承父类Horse方法
m.roll()  # 继承父类Donkey
print(m.show_info())  # 子类Mule自己方法

5.多态性

多态性也是面向对象重要的基本特性之一。“多态”指对象可以表现出多种形态。

例如,猫、狗、鸭子都属于动物,它们有“叫”和“动”等行为,但是叫的方式不同,动的方式也不同。

a.继承多态

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/30 13:25
@File: duotaii.py
@IDE: PyCharm
"""

class Animal:
    def speak(self):
        print("动物叫声,但是不知道是哪种动物!")

class Cat(Animal):
    def speak(self):
        print('小猫:喵喵喵。。')

class Dog(Animal):
    def speak(self):
        print('小狗:汪汪汪。。')

an1 = Cat()
an2 = Dog()
an1.speak()
an2.speak()

# -*- coding: utf-8 -*-
"""
@Time: 2024/5/30 13:25
@File: duotaii-l.py
@IDE: PyCharm
"""
#接收的obj对象具有speak()方法
def start(obj):
    obj.speak()

class Animal:
    def speak(self):
        print("动物叫声,但是不知道是哪种动物!")

class Cat(Animal):
    def speak(self):
        print('小猫:喵喵喵。。')

class Dog(Animal):
    def speak(self):
        print('小狗:汪汪汪。。')


start(Cat())
start(Dog())

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫哥运维

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

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

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

打赏作者

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

抵扣说明:

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

余额充值