Python面向对象编程

本文介绍了Python面向对象编程的概念,强调其关注程序过程而非仅结果的特点。面向对象的三大特征——封装、继承和多态被详细阐述。封装通过将数据和代码打包到对象中实现信息隐蔽;继承允许子类共享父类的数据和方法;多态则是不同子类对同一方法的不同实现。文章还给出了类的实例,如Cavalry、Archer和Master,展示了如何定义和使用这些类。
摘要由CSDN通过智能技术生成

类的引入的好处:

之前我们学过了函数,函数的好处是,把功能封装起来,以便我们后边可以随时的调用,但是这些都可以说是面向过程变成,他注重的是结果,而我们今天所讲的面向对象它更注重程序的过程,比方说我们现在有一个人走在一条长达一千米的公路上,如果他的行走速度为两米每秒,那他需要多长时间呢?如果用面向过程来解释的话那就直接用1000/2,我们就可以得到结果了,但是如果我们用面向对象来解释的话,我们可以在程序中创建一条长达1000米的公路,然后再创建一个人,设置它的行走速度为两米每秒,然后让程序去运算它会走多少时间,它更加注重过程了,这就是面向对象!

面向对象有三大特征,封装,继承,多态:

封装:我们把乱七八糟的数据都放到一个列表当中,这是一种封装,但是这是属于数据层面的封装,我们还可以把常用的代码段打包成一个函数,这是语句的封装,咱们今天学的面向对象就是这两种的合一。对象是模拟真实世界,把数据和代码都封装到一起,为什么说对象是对真实世界的封装呢,一会我们就可以感受到了。封装更是一种信息隐蔽技术,让我们的数据更加安全,比如说:列表,列表是Python的一个序列对象,那我们需要对里边的数据进行数据排序,我们怎么做呢?那咱们不由自主的就想起来用到sort方法,那我们提到了方法二字,没错,python的列表事实上就是一个对象,提供了诺干种方法,供我们根据需求调整列表,但是咱们知道列表对象里边的这些方法是怎么实现的吗?必然不知道!我们知道列表对象里边有哪些变量么?必然也不知道!这就是所谓的封装,它封装起来,只给我们每个方法的名字,当咱们需要用到这个方法的时候,直接调用这个名字就可以了。那他具体怎么实现的有没有告诉我们?----没有。OK!这就是封装。

继承:继承,就是子类自动共享父类之间数据和方法的机制,比如说我们随便先定义一个类,然后我们让他继承list,下边我们用Pass代替,也就是说我们不做任何事情,只是继承list,然后我们把这个类实例化出来,那么我们这个类也就有了List的所有方法,这就是继承

class MyList(list):
    pass

# 实例化对象
list1 = MyList()

list1.append(5)
list1.append(6)
print(list1)

多态:比方说同学们过来培训,那么有的学H5,有的学java,有的学python等等,我们学的内容都不一样,但是只要我们来了,我们就要学习,那我们上自习的时候,班主任说上课了,开始自习,也就是说我们只是调用了一个开始学习的方法,那么各个学科的同学都去调用自己的学习方法了吧,而班主任是不需要管你是哪个学科的吧,他只要调用一个学习的方法就可以了,剩下的就是H5的调用H5的学习方法,python的调用python的学习方法,也就是说你们都是学生的子类,都继承了学生类,但是你们分为不同形态,也就是说多态就是一个父类有多种具体实现各不相同的子类形态,这就是多态,所以有了继承和多态我们就可以实现大规模的复用,这就是面向对象的好处。

"""
需求:
1、封装一个Person类,
2、封装一下属性:姓名、年龄、存款,
3、封装自我介绍的方法,陈述以上属性,
4、创建一个人,设置基本信息,
5、打印此人信息,
6、令此人进行自我介绍。
"""

# 所有的类都继承于 object 类
class Person:
    # 类属性
    name = "韩梅梅"
    age = 18
    rmb = 20
    # 构造方法:在实例化的时候自动被调用
    def __init__(self,name,age,rmb):
        self.name = name
        self.age = age
        self.rmb = rmb

    # 析构方法:在程序结束的时候自动被调用
    # def __del__(self):
    #     print("__del__:我被调用了!",self.name)
    # 方法
    def tell(self):
        # name = "韩梅梅"
        # age = 18
        # rmb = 20
        print("我叫%s,我今年%s岁了,我有存款%.2f万元"%(self.name,self.age,self.rmb))

# 创建一个人
p = Person("小明",16,10)
p.tell()

p1 = Person("小红",16,11)
p1.tell()

"""
下边我们再来看一个需求:
1、为存款信息添加保护,使其不能直接被访问
2、添加设置密码功能
3、添加存款查询功能,只有输入密码正确的情况下才能查询存款信息
"""

class Person:

    def __init__(self,name,age,rmb):
        # 公有属性
        self.__name = name
        self.age = age
        # 私有属性  不能被直接访问  通过公有方法访问私有属性
        self.__rmb = rmb

    # 公有方法
    def getrmb(self):
        pwd = input("请输入查询密码:")
        if pwd == "123":
            print("我有存款%.2f万元"%(self.__rmb))
        else:
            print("您没有访问权限!")

    # 私有方法  不能直接被访问  通过公有方法访问私有方法
    # def __setrmb(self,rmb):
    #     self.__rmb = rmb

    # def setrmb(self,rmb):
    #     pwd = input("请输入设置密码:")
    #     if pwd == "456":
    #         self.__rmb = rmb
    #         print(self.__rmb)
    #     else:
    #         print("没有设置权限!")

if __name__ == '__main__':
    p = Person("韩梅梅",18,20)
    # print(p.__rmb)

    # p.setrmb(1)
    # p.getrmb()

    # p.name = "小明"
    # print(p.name)

    # p.setrmb(10)

"""
1、封装坏蛋类用以存储坏蛋的信息
2、坏蛋拥有人的一切正常属性和功能
3、坏蛋有恶习属性和作恶方法
4、创建一个坏蛋,为他设置最基本信息和恶习
5、让他作恶
"""

from day12.person import Person
class Bastard(Person):

    def __init__(self,name,age,rmb,badhobby):
        # 拓展父类属性
        super().__init__(name,age,rmb)
        # self.name = name
        # self.age = age
        # self.rmb = rmb
        self.badhobby = badhobby

    # 父类方法重写
    # def tell(self):
    #     print("劳资乃%s,今年%s岁了,劳资有存款%.2f万元,劳资就是喜欢%s"%
    #               (self.name,self.age,self.rmb,self.badhobby))

    # 方法拓展
    # def tell(self):
    #     super().tell()
    #     print("劳资乃%s,今年%s岁了,劳资有存款%.2f万元,劳资就是喜欢%s"%
    #           (self.name,self.age,self.rmb,self.badhobby))

    # def talk(self):
    #     print("劳资乃%s,今年%s岁了,劳资有存款%.2f万元,劳资就是喜欢%s"%
    #           (self.name,self.age,self.rmb,self.badhobby))

if __name__ == '__main__':
    b = Bastard("谢文东",20,200,"喝酒打架")
    b.tell()
    # b.talk()

"""
需求:
1、封装男人类,继承于person类,使之有阳刚风格的自我介绍,使之能咆哮
2、封装女人类,继承于person类,使之有阴柔风格的自我介绍,使之能撒娇
3、封装gay类,使之同时具有男人和女人的特性
4、令其咆哮,令其撒娇
5、令其偏阳刚的进行自我介绍,令其偏阴柔的进行自我介绍
"""

from day12.person import Person
class Man(Person):

    def tell(self):
        print("劳资乃%s,今年%s岁了,劳资有存款%.2f万元"%
              (self.name, self.age, self.rmb))

    def paoxiao(self):
        print("┗|`O′|┛ 嗷~~,劳资就是天下第一!")

class Women(Person):

    def talk(self):
        print("小女子%s,小女今年%d了,小女有存款%.2f万元!" %
              (self.name, self.age, self.rmb))

    def sajiao(self):
        print("喵~~~ 你真讨厌了啦!")

class Gay(Women,Man):
    pass

# m = Man("史泰龙",50,3000)
# m.tell()
# m.paoxiao()
#
# w = Women("金莲",16,0.1)
# w.tell()
# w.sajiao()

g = Gay("库克",45,10000000)
g.tell()
g.talk()
g.paoxiao()
g.sajiao()

class Cavalry:
def attack(self):
print(“见识一下暗影岛的力量!”)
def defend(self):
print(“骑兵防守”)

class Archer:
def attack(self):
print(“明智之选,我瞄的很准,正对眉心!”)
def defend(self):
print(“弓箭手防守”)

class Master:
def attack(self):
print(“即使是死亡,也会因为我的出场而颤抖不已!”)
def defend(self):
print(“法师防守”)

if name == ‘main’:
Army = []

c = Cavalry()
a = Archer()
m = Master()

Army.append(c)
Army.append(a)
Army.append(m)

command = input("请将军下令:")
if command == "一起上":
    for var in Army:
        var.attack()
elif command == "布阵":
    for var in Army:
        var.defend()
elif command == "弓箭手":
    for var in Army:
        # 判断var是Archer的实例
        if isinstance(var,Archer):
            var.attack()
        else:
            var.defend()
elif command == "骑兵":
    for var in Army:
        if isinstance(var,Cavalry):
            var.attack()
        else:
            var.defend()
elif command == "法师":
    for var in Army:
        if isinstance(var,Master):
            var.attack()
        else:
            var.defend()
else:
    print("没听清命令!")

property的作用

class Person:

    def __init__(self,age,name):
        self.__age = age
        self.__name = name
        # self.age = age
    """
    def getage(self):
        return self.__age

    def setage(self,age):
        if age < 0:
            return 0
        else:
            self.__age = age

    # 把方法当作属性来使用
    @property
    def age(self):
        return self.__age
    @age.setter  # 去掉下划线的私有属性 .setter
    def age(self,age):
        if age < 0:
            self.__age = 0
        else:
            self.__age = age
    """
    @property
    def names(self):
        return self.__name

    @names.setter
    def names(self,name):
        self.__name = name

if __name__ == '__main__':

    p = Person(18,"jack")

    # p.setage(10)
    # res = p.getage()
    # print(res)

    # p.age = 10
    # print(p.age)

    # p.age = -1
    # print(p.age)

    p.names = "rose"
    print(p.names)

reprstr

class Test:

    def __init__(self,name="jack",age=12):
        self.name = name
        self.age = age

# 重写__str__
class TestStr(Test):
    # 在没有__str__的时候  __repr__ == __str__
    # 在交互模式下输入实例  回车之后自动调用
    def __repr__(self):
        return "%s:%s?"%(self.name,self.age)
    # 在调用print函数打印实例的时候自动调用
    def __str__(self):
        return "%s:%s!"%(self.name,self.age)

t = TestStr()
print(t)

运算符重载

# class Person:
#     def __init__(self,num):
#         self.num = num

    # 运算符重载
#     def __add__(self, other):
#         return Person(self.num + other.num)
#
#     def __str__(self):
#         return "num = "+str(self.num)
#
# p1 = Person(2)
# p2 = Person(6)

# print(1+1) --> 2
# print("1"+"1") --> 11
# res = p1 + p2
# print(res.num)

# print(p2+p1)

@staticmethod & @classmethod

class Person:
    name = "tom"
    def __init__(self,name):
        # 添加一个实例属性
        self.name = name

    def tell(self):
        # self 是一个实例对象
        print(self.name)

    @classmethod
    def say(cls):
        # cls就是我们定义的类
        print(cls.name)

    @staticmethod
    # 绑定在类里边的一个普通函数
    def talk():
        print(Person.name)

if __name__ == '__main__':
    # p = Person("rose")
    # p.tell()
    # p.say()
    # p.talk()
    # Person.tell("rose")
    Person.say()
    Person.talk()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值