Python类中属性和方法的定义

属性:静态属性(类属性)、实例属性

方法:静态方法、实例方法、类方法、属性包装


 静态属性:一个类中,当某个属性所有实例共有的时候,可以定义为一个静态属性

 实例属性:一个类中,当某些信息每个实例都不相同时,就需要初始化,这时候就可以定义为一                个实例属性

        为什么要使用静态属性?  简单来说就是为了节约内存  
               静态属性和实例属性占用单独的空间,静态属性创建后只会占用固定一块存储空间,而实例属性每次创建都会额外的开辟一个存储空间。将各个实例相同的属性定义成静态属性就可以节约空间

class Bus317(object):
     # 设置静态属性
     # 假设比亚迪品牌是公有的属性
    prod = 'BYD'
    
     # 设置实例属性  driver,plate_number这些信息每个实例都不同,需要使用__init__方法初始化
    def __init__(self,driver,plate_number,color='green'):
    self.driver =driver
    self.plate_number= plate_number
    self.color = color


# 实例化BUS317
b1 = Bus317("路小飞",'湘A88888')
print(b1.driver,b1.plate_number,b1.color,b1.prod)

上述的BUS317类是继承自父类Object的(python类中默认所有类继承object)


方法:

        实例方法:当一个实例需要执行某项任务时,就可以定义一个实例方法,实例方法必须要有一个self参数


class Bus317(object):
     # 设置静态属性
     # 假设比亚迪品牌是公有的属性
    prod = 'BYD'
     # 设置实例属性  driver,plate_number这些信息每个实例都不同,需要使用__init__方法初始化
    def __init__(self,driver,plate_number,color='green'):
          self.driver =driver
          self.plate_number= plate_number
          self.color = color
   # 定义一个实例方法,实例方法必须要有self参数
   def run(self):
          print(f"{self.driver}开的{self.plate_number}往返于湖南XX大学与长华小区")
# 实例化BUS317
b1 = Bus317("路小飞",'湘A88888')
print(b1.driver,b1.plate_number,b1.color,b1.prod)
# 调用实例方法
b1.run()

注意对象的实例化(初始化)首先调用执行的是__new__()方法(这和下面的__init__()方法都是一个魔术方法)。__new__方法的作用是创建并且返回一个实例,然后在对这个实例进行初始化__init__()方法,否则是不会执行__init__方法的。
  上述例子没有看到__new__方法是因为父类object中有new方法,子类BUS317直接继承了父类的方法

        静态方法:利用到了@staticmethod 装饰器,假若没有用到实例的数据和类的数据(静态属性),可以定义为静态方法
        静态方法中不需要传入self参数,因此无法访问在静态方法中访问静态实例变量。
        静态方法中不可以直接访问类的静态变量,但可以通过类名引用静态变量。

class Pig(object):
    # 静态属性
    category = 'pig'
    number = 0
    def __init__(self,num):
        self._num = self.num_fun(num)
    # 定义一个静态方法
    @staticmethod
    def p_staticmethod():
        print("这是一个静态方法")

    # 定义一个静态方法,通过属性名称访问
    @staticmethod
    def num_fun(num):
        if num == 0:
            return num
        else:
            raise ValueError("number数值不对")

p = Pig(0)
p.p_staticmethod()
# 输出:print("这是一个静态方法")

   类方法:使用@classmethod 装饰器。可以解决硬编码的我问题
                 只能在类中调用,只能使用静态属性,不能调用实例属性。

class Pig(object):
     # 静态属性 用于统计对象的个数
     number = 0

    # 定义一个类方法
    @classmethod
    # cls表示当前类本身 ,将方法定义成类方法用于解决硬编码的问题
    # 每创建一个对象number加1
    def a_classmethod(cls):  
        cls.number += 1

    # 在类可中直接调用类方法
    def __init__(self,name):
        self.name = name
        # Pig.number += 1      # 未定义类方法时候需要指定类名
        self.a_classmethod()    # 定义了类方法后只需要使用self调用,避免了硬编码

#调用
p1 = Pig('八戒')
p2 = Pig('沙僧')
print(Pig.number)
输出:2

     属性包装:使用@property 装饰器
                        将一个方法包装,用起来像一个实例属性
                        age方法一定要返回一个结果 如:return age
                        包装age方法后,可以把age当成属性直接修改数值大小

# 将age方法包装为一个属性
class Person(object):
    def __init__(self,name,age):
        self.name = name
        self._age = self.check_age(age)  # 属性不能和方法同名
    # 当包装age后,自动生成几个装饰器。 age.setter,age.deleter
    # age方法一定要返回一个结果 print(p1.age)
    # 包装age方法
    @property
    def age(self):
        return self._age
    # 包装age方法后,可以把age当成属性直接修改数值大小
    @age.setter  # 默认生成的装饰器
    def age(self,value):
        self._age = self.check_age(value)
    # 设置静态方法
    @staticmethod
    def check_age(age):
        if 0 <= age <= 150:
            return age
        else:
            raise ValueError("输入的数值不在范围内")

a1 = Person('cali',100)
print(a1.age)
a1.age = 150
print(a1.age)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值