面向对象_成员

目录

  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)      # 

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

你可能感兴趣的:(面向对象_成员)