美文网首页
面向对象_成员

面向对象_成员

作者: qjh_py | 来源:发表于2020-07-19 19:32 被阅读0次

    目录

    1. 成员
    2. 字段介绍
    3. 方法介绍
    4. 属性

    1. 成员

    成员介绍
    类的成员可分为字段、方法以及属性。

    2. 字段介绍

    前一篇文章中的属性,更准确来说被称为字段。字段又主要可以分为普通(实例)字段与静态(类)字段。

    • 普通字段(实例属性)
      普通字段属于对象,保存在对象中,只能通过对象访问。
      定义:self.字段名称
      访问:self.字段名称 或 对象.字段名称

    但是这样实现,会有相应的问题。比如说,普通字段保存在对象中,也就是说,当存对象的字段值相同时,仍然使用普通字段便会造成我们内存的浪费。

    • 静态字段(类属性)
      静态字段属于类,保存在类中。在创建时,仅创建一份,并且所有对象都共享静态字段。执行时可以是类访问也可以是对象访问。
      定义:直接在类中定义
      访问:类名.字段名称 或 self.字段名称 或 对象.字段名称
    • 总结
      在实际开发中,如果字段的值是固定的,不随对象的改变而改变。那就使用静态字段(类属性),这样有利于节省内存的消耗。而如果字段的值随对象的改变而改变,就使用普通字段(实例属性)。

    3. 方法介绍

    类的方法主要可分为普通方法(实例方法),类方法,静态方法。
    普通方法(实例方法)

    • 普通方法保存在类中,在实例化对象后,一般通过对象调用。第一个参数必须为系统自建参数,默认为self,代指对象本身。
      注意:self仅仅是变量名。使用其它也可,但最好不要修改。
      • 应用场景
        当方法中需要使用普通字段(实例对象)时,通常使用普通方法。
    • 静态方法
      静态方法通过在方法上面添加@staticmethod装饰器定义,保存在类中;
      静态方法不需要传入self参数,即使传入了self参数也并不像普通方法那样代指对象本身,仅仅是一个普通的形参。
      静态方法的调用虽然可以通过对象调用,但一般由类调用。
      • 应用场景
        静态方法的参数并不代表对象这一特点,使静态方法在类中使用起来更像一个单纯的函数。完全可以将静态方法放在类的外部,当成函数使用。但是放在类中,便于使用与维护。
    • 类方法
      类方法通过在方法上面添加@classmethod装饰器,保存在类中;
      类方法不需要传入self。但有一个系统自建参数为cls,cls代指类本身;
      类方法一般通过类调用,也可通过对象调用。
      定义及访问如下:
    class Demo:
    
        @classmethod        # 通过@classmethod装饰器将方法转为静态
        def clasmd(cls):    # 自建cls参数 代指 当前类
            print(cls)      # <class '__main__.Demo'>
    
    d = Demo()
    Demo.clasmd()    # 通过 类名 调用
    
    • 总结


    4. 属性

    在实际开发中,为了简便,当想访问方法以属性的访问形式时,就可以通过在方法上面添加@property装饰器,达到该效果。
    定义及访问如下:

    class Demo:
        def __init__(self):
            self.name = "rose"
    
        @property
        def test(self):
            print(self.name)
    
    d = Demo()
    d.test    # 通过@property 以 普通属性 形式访问 普通方法 (不带方法的括号,即不是调用) 
    # rose
    d.test()
    # rose
    # TypeError: 'NoneType' object is not callable
    
    • 注意:以上@property只相当于一个只读属性,也就是说,仅能访问test函数的内容。
    • 用法示例:
      需求:
      1.通过传参去改变self.name的值
      2.删除掉self.name

    具体实现代码如下:

    class Demo:
        def __init__(self):
            self.name = "rose"
    
        @property
        def test(self):     # 只可访问模式
            print(self.name)
    
        @test.setter        # d.set_test = "jack"
        def test(self,para):
            self.name = para
            print(self.name)
    
        @test.deleter
        def test(self):    # del d.test 
            del self.name
            print(self.name)  # 报错  self.name已被删除
    
    d = Demo()
    d.test            # 通过@property 只读模式
    
    # 改变self.name的值
    d.test = "jack"   # 给方法传参 以 赋值方式 会触发@test.setter
    
    # 删除self.name
    del d.test        # del 会 触发 @test.deleter
    

    相关文章

      网友评论

          本文标题:面向对象_成员

          本文链接:https://www.haomeiwen.com/subject/nfyrkktx.html