首页 > 编程语言 >【python】面向对象之类成员(属性)

【python】面向对象之类成员(属性)

时间:2024-08-21 22:26:24浏览次数:7  
标签:obj get python self 面向对象 property price def 属性

  • 1.属性的定义
    • 1.1:属性的定义有两种方式:
      • 装饰器 即:在方法上应用装饰器
      • 静态字段 即:在类中定义值为property对象的静态字段
    • 1.2:装饰器方式
      • 在类的普通方法上应用@property装饰器
      • 经典类
class Goods:

    @property
    def price(self):
        return "xwl"
# ############### 调用 ###############
obj = Goods()
result = obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
print(result)  # xwl
- 新式类
# ############### 定义 ###############
class Goods(object):

    @property
    def price(self):
        return '@property'

    @price.setter
    def price(self, value):
        print(value)
        return '@price.setter'

    @price.deleter
    def price(self):
        return '@price.deleter'

# ############### 调用 ###############
obj = Goods()

print(obj.price)        # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数

del obj.price      # 自动执行 @price.deleter 修饰的 price 方法
  • 1.3:注意

    • 经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法
    • 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法
    • 由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
  • 2.属性的使用

    • 2.1:当使用静态字段的方式创建属性时,经典类和新式类无区别
    • 2.2:property的构造方法中有个四个参数
      • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
      • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
      • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
      • 第四个参数是字符串,调用 对象.属性.doc ,此参数是该属性的描述信息
class Foo:
    def get_bar(self):
        return 'xwl'

    # *必须两个参数
    def set_bar(self, value):
        print('set value' + value)
        return 'set value' + value

    def del_bar(self):
        print('del bar')
        return 'xwl'

    BAR = property(get_bar, set_bar, del_bar, 'description...')

obj = Foo()

print(obj.BAR)         # 自动调用第一个参数中定义的方法:get_bar
obj.BAR = "gmm"        # 自动调用第二个参数中定义的方法:set_bar方法,并将“gmm”当作参数传入
del obj.BAR            # 自动调用第三个参数中定义的方法:del_bar方法
obj.BAR.__doc__       # 自动获取第四个参数中设置的值:description...
  • 2.3:示例1
class Goods(object):

    def __init__(self):
        # 原价
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    def get_price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    def set_price(self, value):
        self.original_price = value

    def del_price(self, value):
        del self.original_price

    PRICE = property(get_price, set_price, del_price, '价格属性描述...')

obj = Goods()
obj.PRICE         # 获取商品价格
obj.PRICE = 200   # 修改商品原价
del obj.PRICE     # 删除商品原价
  • 示例2,Python WEB框架 Django 的视图中 request.POST 就是使用的静态字段的方式创建的属性
class WSGIRequest(http.HttpRequest):
    def __init__(self, environ):
        script_name = get_script_name(environ)
        path_info = get_path_info(environ)
        if not path_info:
            # Sometimes PATH_INFO exists, but is empty (e.g. accessing
            # the SCRIPT_NAME URL without a trailing slash). We really need to
            # operate as if they'd requested '/'. Not amazingly nice to force
            # the path like this, but should be harmless.
            path_info = '/'
        self.environ = environ
        self.path_info = path_info
        self.path = '%s/%s' % (script_name.rstrip('/'), path_info.lstrip('/'))
        self.META = environ
        self.META['PATH_INFO'] = path_info
        self.META['SCRIPT_NAME'] = script_name
        self.method = environ['REQUEST_METHOD'].upper()
        _, content_params = cgi.parse_header(environ.get('CONTENT_TYPE', ''))
        if 'charset' in content_params:
            try:
                codecs.lookup(content_params['charset'])
            except LookupError:
                pass
            else:
                self.encoding = content_params['charset']
        self._post_parse_error = False
        try:
            content_length = int(environ.get('CONTENT_LENGTH'))
        except (ValueError, TypeError):
            content_length = 0
        self._stream = LimitedStream(self.environ['wsgi.input'], content_length)
        self._read_started = False
        self.resolver_match = None

    def _get_scheme(self):
        return self.environ.get('wsgi.url_scheme')

    def _get_request(self):
        warnings.warn('`request.REQUEST` is deprecated, use `request.GET` or '
                      '`request.POST` instead.', RemovedInDjango19Warning, 2)
        if not hasattr(self, '_request'):
            self._request = datastructures.MergeDict(self.POST, self.GET)
        return self._request

    @cached_property
    def GET(self):
        # The WSGI spec says 'QUERY_STRING' may be absent.
        raw_query_string = get_bytes_from_wsgi(self.environ, 'QUERY_STRING', '')
        return http.QueryDict(raw_query_string, encoding=self._encoding)
    
    # ############### 看这里看这里  ###############
    def _get_post(self):
        if not hasattr(self, '_post'):
            self._load_post_and_files()
        return self._post

    # ############### 看这里看这里  ###############
    def _set_post(self, post):
        self._post = post

    @cached_property
    def COOKIES(self):
        raw_cookie = get_str_from_wsgi(self.environ, 'HTTP_COOKIE', '')
        return http.parse_cookie(raw_cookie)

    def _get_files(self):
        if not hasattr(self, '_files'):
            self._load_post_and_files()
        return self._files

    # ############### 看这里看这里  ###############
    POST = property(_get_post, _set_post)
    
    FILES = property(_get_files)
    REQUEST = property(_get_request)

标签:obj,get,python,self,面向对象,property,price,def,属性
From: https://www.cnblogs.com/xwltest/p/18372696

相关文章

  • Python程序设计现代方法1课后习题1Python 开发概述
    Python程序设计现代方法1课后习题1Python开发概述1.整数求和。输入整数n,计算1~n之和。defsum_of_integers(n):returnsum(range(1,n+1))n=int(input("请输入整数n:"))print(f"1~{n}的和为:{sum_of_integers(n)}")2.整数排序。输入三个整数,把这三个数由......
  • Python被远程主机强制关闭后怎么自动重新运行进程
    要实现Python程序在被远程主机强制关闭后能够自动重新运行,我们可以采用几种方法,但最直接且常用的方法之一是结合操作系统级的工具或脚本。在Linux系统中,我们可以使用cron作业或者systemd服务来实现这一功能;在Windows系统中,可以使用任务计划程序。但在这里,为了提供一个跨平台的、更......
  • 【python】面向对象之类成员(字段,方法)
    1.类的成员可以分为三大类:字段、方法和属性注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。2.字段字段包括:普通字段和静态字段,他们在定义和使用中有......
  • 【python】面向对象之继承
    1.什么是继承?通过继承,我们可以从既有的类上衍生出新的类。如果程序的需求为仅修改或删除某项功能,此时不需要将该类的成员数据及成员函数重新写一遍,只需要“继承”原先已定义好的类就可以产生新的类了。继承是指将现有类的属性和行为,经过修改或重写(Override)之后,就可产生出拥有......
  • Python 正则表达式详解 带例题演示
    Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python语言拥有全部的正则表达式功能。compile函数根据一个模式字符串和可选的标志......
  • 【学习笔记】 陈强-机器学习-Python-Ch11 决策树(Decision Tree)
    系列文章目录监督学习:参数方法【学习笔记】陈强-机器学习-Python-Ch4线性回归【学习笔记】陈强-机器学习-Python-Ch5逻辑回归【课后题练习】陈强-机器学习-Python-Ch5逻辑回归(SAheart.csv)【学习笔记】陈强-机器学习-Python-Ch6多项逻辑回归【学习笔记及课后......
  • 【python】面向对象之封装
    一:面向对象编程有三大特性:封装、继承、多态二:其中最重要的一个特性就是封装。封装指的就是把数据与功能都整合到一起三:什么是封装?1.数据角度讲,将一些基础数据类型复合成一个自定义类型2.行为角度讲,向类外提供必要的功能,隐藏实现的细节3.设计角度分而治之将一个......
  • Linux系统下CUDA与tensorflow与python的版本对应关系
    LinuxCPUVersionPythonversionCompilerBuildtoolstensorflow-2.16.13.9-3.12Clang17.0.6Bazel6.5.0tensorflow-2.15.03.9-3.11Clang16.0.0Bazel6.1.0tensorflow-2.14.03.9-3.11Clang16.0.0Bazel6.1.0tensorflow-2.13.03.8-3.11Clang16.0.0Bazel5.3.0tensorflow-2.......
  • Python 异常处理:掌握错误控制的艺术
            在编程的世界里,错误和异常是不可避免的。正确地处理它们是编写健壮、可靠软件的关键。Python提供了一套强大的异常处理机制,允许我们捕获和处理程序运行时出现的错误。在本文中,我们将探讨Python中的异常处理,包括try-except块、自定义异常、finally子句以......
  • Selenium + Python 自动化测试21(PO+HTML+Mail)
            我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。上一篇我们讨论了PO模式并举例说明了基本的思路,今天我们继续学习。        本篇文章我们综合一下之前学习的内容,如先将PO模式和我们生成HTML报告融合起来,综合的灵活的使用之......