当前位置: 首页 > news >正文

Python 面向对象编程进阶

1. 面向对象高级语法

1.1 静态方法(@staticmethod)

  • 静态方法: 只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
  • 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
class Dog(object):def __init__(self,name):self.name = name@staticmethod   # 普通函数,实际上跟类没什么关系了def eat(self):print("%s is eating %s" %(self.name,"骨头"))d = Dog("狗")
d.eat(d)

1.2 类方法(@classmethod)

类方法: 通过@classmethod装饰器实现,类方法和普通方法的区别是: 类方法只能访问类变量,不能访问实例变量

class Dog(object):n = "狗"  # 类变量def __init__(self,name):self.name = name  # 实例变量# @classmethod  类方法只能访问类变量@classmethoddef eat(self):print("%s is eating %s" %(self.n,"骨头"))# 不能访问实例变量,会报错# print("%s is eating %s" %(self.name,"骨头"))def talk(self):print("%s is talking" %self.name)
d = Dog("泰迪")
d.eat()

1.3 属性方法(@property)

  • 属性方法: 作用就是通过@property把一个方法变成一个静态属性。
  • 属性方法不能传参,可以赋值。
  • 通过@property把 eat(self) 方法变成静态属性。 再写一个eat方法,通过 @方法名.setter(@eat.setter)的方式赋值
    • @eat.setter 赋值
    • @eat.getter 获取
    • @eat.deleter 删除
class Dog(object):def __init__(self,name):self.name = nameself.__food = None@property       # 静态属性def eat(self):print("%s is eating %s" %(self.name,self.__food))@eat.setter     # 静态属性赋值,需要再写一个eat方法def eat(self,food):print("set to food:",food)self.__food = food@eat.deleter    # 静态属性删除方法。def eat(self):del self.__foodprint("删完了")def talk(self):print("%s is talking" %self.name)
d = Dog("狗")d.eat
# 赋值
d.eat="骨头"
d.eat
# 删除属性
del d.eat

2. 类的特殊成员方法

2.1 __doc__

  • __doc__ 类的描述信息
class Foo:""" 描述类信息"""def func(self):passprint (Foo.__doc__)
#输出:描述类信息

2.2 __module__ 和 __class__

  • __module__,表示当前操作的对象在那个模块
  • __class__,表示当前操作的对象的类是什么

创建一个a.py文件

class c:def __init__(self):self.name = "C"

创建一个b.py文件

from a import c
obj = c()
print(obj.__module__)   # 输出:a,输出模块
print(obj.__class__)    # 输出:<class 'a.c'>,输出类

2.3 __init__

  • __init__,构造方法,通过类创建对象时,自动触发执行。
class Student():def __init__(self):self.name = "jack"self.age = 18def info(self):print(f"{self.name}今年{self.age}岁了")
stu = Student()
stu.info()# 外部传参
class Student():def __init__(self,name,age):self.name = nameself.age = agedef info(self):print(f"{self.name}今年{self.age}岁了")
stu = Student("Jack",18)
stu.info()

2.4 __del__
析构方法,当对象在内存中被释放时,自动触发执行。

class Foo:def __del__(self):print(f'{self}对象已被释放')obj = Foo()

2.5 __call__

对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class A:def __init__(self):self.name = "C"def __call__(self, *args, **kwargs):print("running call",args,kwargs)# 运行 __call__
A()()a = A()
# 运行 __call__
a(1,2,3,name="Tom")

2.6 __dict__

  • __dict__ 查看类或对象中的所有成员  
class Dog(object):'''sadf asdf '''n = 333def __init__(self, name):self.name = nameself.__food = None# @staticmethod   #实际上跟类没什么关系了# @classmethod@property  # @attributedef eat(self):print("%s is eating %s" % (self.name, self.__food))@eat.setterdef eat(self, food):print("set to food:", food)self.__food = food@eat.deleterdef eat(self):del self.__foodprint("删完了")def talk(self):print("%s is talking" % self.name)d = Dog("aa")print(Dog.__dict__) # 打印类里的所有属性,不包括实例变量
print(d.__dict__)   # 打印类里的实例变量,不包括类属性

2.7 __str__

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出str方法的返回值。

class Foo:def __str__(self):  return '返回值'obj = Foo()
print(obj) # 输出:返回值
print(obj) # 如果不写 __str__ 返回 obj的地址值

2.8 __getitem__ 、__setitem__ 、__delitem__

  • 用于索引操作,如字典。以上分别表示获取、设置、删除数据
    • getitem 获取
    • setitem 设置
    • delitem 删除
class Foo(object):def __getitem__(self, key):print('__getitem__',key)def __setitem__(self, key, value):print('__setitem__',key,value)def __delitem__(self, key):print('__delitem__',key)obj = Foo()result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'alex'   # 自动触发执行 __setitem__
del obj['k1']

2.9 __metalass__ 和 __new__

  • __metalass__ 其用来表示该类由 谁 来实例化创建
  • __new__ 触发 __init__创建实例
http://www.jsqmd.com/news/36976/

相关文章:

  • 详细介绍:线性代数 几何意义 | 基础、向量、行列式与线性方程组(上篇)
  • Emacs Org-Mode插入文本内容,自动对齐表格(Org-Babel)
  • 在Zabbix中修改Web页面显示名称
  • 2025 年 11 月润滑油厂家推荐排行榜,工业润滑油,汽车润滑油,发动机润滑油,甲醇发动机润滑油,全合成润滑油公司精选
  • 2025 年 11 月护栏生产厂家推荐排行榜,锌钢护栏,市政护栏,道路护栏,阳台护栏,草坪护栏公司推荐
  • python中Flask框架下session的使用
  • 20232406 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 软件工程学习日志2025.11.10
  • 172. 阶乘后的零
  • 2025 年 11 月储罐厂家推荐排行榜,钢衬塑储罐,钢塑复合储罐,化工储罐,防腐储罐,PE储罐,盐酸储罐,硫酸储罐,聚丙烯储罐,不锈钢储罐,次氯酸钠储罐公司推荐
  • AWS云从业者认证学习指南与练习平台
  • 微服务已死?别再盲目跟风微服务!这3种情况下单体架构更适合你。
  • Oracle LogMiner实战指南:误删误改数据的救命稻草
  • Spring 事务 - 实践
  • 2025 年 11 月危险品运输厂家推荐排行榜,危险品运输车,危险品运输罐,危险品运输物流,危险品运输公司专业实力与安全服务深度解析
  • Spring AI Alibaba 项目源码学习(二)-Graph 定义与描述分析
  • 20232422 2024-2025-1 《网络与系统攻防技术》实验四实验报告
  • SpringBoot热启动
  • SPI 设备与多从机冲突的解决之道:片选管理、CS 去抖与总线隔离策略 - 实践
  • 2025 年 11 月超声波检测设备厂家推荐排行榜,超声波检测系统,相控阵/高频/水浸/液冷板/钎焊超声波检测,高频相控阵超声波检测设备厂家推荐
  • 对于生成虚tree进行DP——CF1097G Vladislav and a Great Legend
  • 2025 年 11 月除蜡水厂家推荐排行榜,钢铁除蜡水,不锈钢除蜡水,金属除蜡水,工业除蜡水公司推荐
  • 使用napi-rs,通过node调用rust代码
  • 20232309 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 智语写作都有哪些功能?看这一篇就够了!智语写作全功能详解
  • pythontip 字符串转为字典
  • Microsoft Activation Scripts (MAS)
  • rufus.ini
  • 团队作业2
  • Explorer++