Python面向对象详解(4-3)

举报
乂氼S 发表于 2023/05/28 13:31:28 2023/05/28
【摘要】 Python面向对象详解(4-3)

 目录

一.类中的私有函数和私有变量

1.什么是私有函数、私有变量?

2.私有函数和私有变量的定义方法

3.实战

二 .Python类中的封装

1.python中的封装概念

 三.装饰器

1.什么是装饰器?

2.装饰器的定义

3.装饰器的用法

4.实战

 四.类的常用装饰器

1.classmethod(类方法)的功能

2.classmethod的用法

3.staticmethod的功能 

4.staticmethod的用法

5.property的功能

6.property的用法

7.实战



一.类中的私有函数和私有变量

1.什么是私有函数、私有变量?

  • 无法被实例化后的对象调用的类中的函数与变量
  • 类内部可以调用私有函数与变量
  • 只希望类内部业务调用使用,不希望被使用者调用
  • 我们可以把被实例化对象调用的函数和变量称为公用函数和公有变量,一般会把公有省略掉。

2.私有函数和私有变量的定义方法

  • 在变量或函数前添加__(2个下横线),变量或函数名后边无需添加

编辑
  • 如果左右都添加了下横线,那么它就成了类的内置函数的定义规范 

3.实战

  

# coding:utf-8

"""
    既然定义为私有函数,就是不希望被实例化对象所调用,所以我们最好还是按照规定使用比较好
"""


class Cat(object):
    __cat_type = 'cat'  # 创建私有属性

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

    def run(self):
        # pass  # 占位符,当不知道程序要写什么的时候,写上pass,因为只有函数名没有函数体程序会报错
        result = self.__run()
        print(result)

    def __run(self):
        return f'{self.__cat_type} 小猫 {self.name}{self.__sex} 开心的奔跑着 '

    def jump(self):
        result = self.__jump()
        print(result)

    def __jump(self):
        return f'{self.__cat_type} 小猫 {self.name}{self.__sex} 开心的跳着'


class Test(object):
    pass  # 占位符,当不知道程序要写什么的时候,写上pass,不然程序会报错


cat = Cat(name='小舒', sex='girl')
cat.run()
cat.jump()
#  cat.__run()  # 会报错
print(dir(cat))  # 查看cat这个实例中都有那些函数

print(cat._Cat__jump())  # 实例._类名__方法名,这样可以调用私有函数
# print(cat.__sex) 会报错
print(cat._Cat__sex)


  输出结果:


cat 小猫 小舒girl 开心的奔跑着 
cat 小猫 小舒girl 开心的跳着
['_Cat__cat_type', '_Cat__jump', '_Cat__run', '_Cat__sex', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'jump', 'name', 'run']
cat 小猫 小舒girl 开心的跳着
girl

进程已结束,退出代码0

二 .Python类中的封装

其实python并没有封装这个功能,只是针对Python中某种业务场景的一种概念

1.python中的封装概念

  • 将不对外的私有属性或方法通过可对外使用的函数而使用(类中定义私有的,只有类内部使用,外部无法访问)
  • 这样做的主要原因:保护隐私,区分内外

  封装的例子:

  编辑



 三.装饰器

1.什么是装饰器?

  • 也是一种函数
  • 可以接受函数作为参数可以返回函数
  • 接收一个函数,内部对其处理然后返回一个新函数,动态的增强函数功能
  • 比如将c函数在a函数中执行,在a函数中可以选择执行或不执行c函数,也可以对c函数的结果进行二次加工处理

编辑

2.装饰器的定义

编辑

3.装饰器的用法

  • 将被调用的函数直接作为参数传入装饰器的外围函数括弧 

  • 将装饰器与被调用函数绑定在一起

  • @符号 + 装饰器函数放在被调用函数的上一行,被调用的函数正常定义,只需要直接调用被执行函数即可

 编辑


4.实战

# coding:utf-8

def check_str(func):
    print('func', func)

    def inner(*args, **kwargs):
        print('args', args, kwargs)
        result = func(*args, **kwargs)
        if result == 'ok':
            return 'return is %s' % result
        else:
            return 'return is failed: %s' % result

    return inner


@check_str
def test(data):
    return data


result = test('no')
print(result)
result = test('ok')
print(result)

  输出结果:

func <function test at 0x0000023980018360>
args ('no',) {}
return is failed: no
args ('ok',) {}
return is ok

进程已结束,退出代码0

 四.类的常用装饰器

  • classmethod
  • staticmethod
  • property

1.classmethod(类方法)的功能

  • 将类函数可以不经过实例化而直接被调用

2.classmethod的用法

  • 用法:

编辑


  •  参数介绍:
  • cls替代了普通类函数中的self,变为cls,代表当前操作的是类

在实例化的过程中,Python会将self提前传入需要self函数的括弧中,所以我们在执行的时候并不需要传递,但如果没有实例化,所以Python没办法自动为我们添加self到需要的类函数中,于是就会报错,这时候如果不想通过实例化来调用类函数,装饰器classmethod就会派上用处了

3.staticmethod的功能 

  • 将类函数可以不经过实例化而直接被调用,被该装饰器调用的函数不允许传递self和cls参数,且因为没有self和cls参数而无法在该函数内调用其他类函数或类变量

4.staticmethod的用法

  • 用法:

编辑

  • 参数介绍:
  • 函数体内无selfcls参数 

编辑

5.property的功能

  • 将一个方法转化为属性,使类函数的执行免去括弧,类似于调用属性(变量)

6.property的用法

  • 用法:

编辑

  • 参数介绍:无重要函数说明

编辑

  • 对使用porperty装饰的函数,如果要修改变量就要使用@被property装饰的函数名.setter来修改
  • class Test1(object):
        def __init__(self, name):
            self.__name = name
    
        @property
        def name(self):
            return self.__name
    
        # 对property装饰的函数,要修改变量用以下方法
        @name.setter
        def name(self, value):
            self.__name = value
    
    
    print('------------')
    t1 = Test1(name='xiaoshu')
    print(t1.name)
    t1.name = 'xiaoding'
    print(t1.name)

    输出结果:

  • ------------
    xiaoshu
    xiaoding
    
    进程已结束,退出代码0
    

7.实战

# coding:utf-8

class Test(object):
    def __init__(self, a):
        self.a = a

    def run(self):
        print('run')
        self.jump()  # 在类函数中的内部是可以直接调用包含classmethod和staticmethod装饰器的类函数
        self.sleep()

    @classmethod
    def jump(cls):
        print('jump')
        # cls.run()  # 无法在使用classmethon装饰器类函数中去直接调用包含self参数的函数

    # 无法调用以上两种,因为它的括弧中不包含self和cls,所以也就不能直接调用了
    @staticmethod
    def sleep():
        print('i want to sleep')


t = Test('a')
t.run()
Test.jump()
t.jump()  # 另外也可以通过实例化对象进行调用

print('----')
Test.sleep()
t.sleep()  # 另外也可以通过实例化对象进行调用

class Test1(object):
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    # 对property装饰的函数,要修改变量用以下方法
    @name.setter
    def name(self, value):
        self.__name = value

print('------')
t1 = Test1(name='sl')
print(t1.name)
t1.name = 'dx'
print(t1.name)

  输出结果:


run
jump
i want to sleep
jump
jump
----
i want to sleep
i want to sleep
------
sl
dx

进程已结束,退出代码0


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。