Python类中属性和方法的定义 您所在的位置:网站首页 Python中属性怎么定义 Python类中属性和方法的定义

Python类中属性和方法的定义

2024-01-01 08:25| 来源: 网络整理| 查看: 265

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

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

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

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

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

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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有