python基础教学day12---魔术方法

本文深入讲解了Python中的魔术方法,包括特殊属性、对象的创建与销毁、类型转换、索引与切片等核心概念,提供了丰富的代码案例,帮助读者理解和掌握Python的高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、特殊属性

1、

魔术方法名称功能
方法__name__类、函数、方法等的名字
方法__module__类定义所在的模块
方法__class__对象或类所属的类
方法__bases__当前类的基类(父类)
方法__doc__类、函数的文档帮助,没有定义为None
方法__mro__Method Resolution Order 方法解析顺序
方法__dict__类或实例的属性,可写的字典

2、dir__返回类或者对象的所有成员名称列表。dir()函数就是调用__dir()。

  • 如果dir([obj])参数包含方法__dir__(),该方法将被调用。
  • 如果Obj不包含__dir__(),该方法将最大限度收集属性信息。

3、dir(obj) 对于不同类型的对象obj具有不同的行为:
1).如果对象是模块对象,返回的列表包含模块的属性名和变量名
2).如果对象是类型或者类对象,返回的列表包含类的属性名,及它的基类的属性名
3).如果obj不写 即dir(),返回列表包含内容不同

  • 在模块中,返回模块的属性和变量名
  • 在函数中,返回本地作用域的变量名
  • 在方法中,返回本地作用域的变量名
from collections import Counter
class A(object):
    pass


class C(object):
    pass


class Date(A, C):
    """
    时间类的封装
    """
    country = 'china'
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
    def __dir__(self):
        return  {'country': self.country}
print(Date.__name__)
# 类定义所在的模块, 如果在当前脚本, 返回__main__, 否则, 返回真实的模块名eg: collections
print(Date.__module__)
print(Counter.__module__)
# 对象或类所属的类: 是由哪个类实例化出来的;
d = Date(2019, 10, 10)
print(d.__class__)  # d对象是由Date类实例化出来的;
print(Date.__class__)  # type(1)Date类是由type类实例化出来的;  Python中一切皆对象; 看到的类实质上也是对象;
# 当前类的基类(父类)
print(Date.__bases__)
print(A.__bases__)
print(object.__bases__)  # object没有父类;
# 类、函数的文档帮助,没有定义为None
print(Counter.__doc__)
print(Date.__doc__)
# Method Resolution Order 方法解析顺序, 实质上是显示类的继承顺序; python3中多继承的算法是广度优先
print(Date.__mro__)
# 类或实例的属性,可写的字典
print(Date.__dict__)
print(dir(Date))
print(dir())
def add(x, y):
    print(dir())
    return x + y
add(1, 2)

二、创建、初始化与销毁

这三者的区别__new__ ,init , del
1、new 的功能是在生成对象之前所做的动作,接受的是cls类,负责对象的创建
2、__init__是在对象生成之后完善对象的属性,它接受的是self对象,负责对象的初始化
3、对象生成是在new里面return(返回一个对象)

class Student(object):
    def __new__(cls, name):
        print('正在new.....')
        # 不知道new方法试药干吗的, 直接返回父类的new方法
        return  super(Student, cls).__new__(cls)

    # 初始化(构造)方法: 创建对象时自动执行
    def __init__(self, name):
        print("正在初始化对象.....")
        self.name = name

    # 析构方法: 对象删除时自动调用
    def __del__(self):
        print("正在删除对象.....")


# 当程序运行结束之后, 会自动释放变量信息. 会自动调用析构方法;
s = Student('westos')
print(s.name)

三、可视化

1、类型判断要使用type或sinstance,不能通过判断print输出是否带来引号来判断输出值的类型
1)str()与reper()都是python中的内置函数,是直接用来格式化字符串的函数
2)而__str__与__reper__是在类(对象)中对类(对象)本身进行字符串处理。
2、str:返回一个可以用来表示对象的可打印的友好的字符串

  • 对字符串,返回本身
  • 没有参数,则返回空字符串
  • 对类,可通过__str__()成员控制其行为。改成员不存在,则使用其__repr__()成员。

四、类型转换

在这里插入图片描述
代码案例

class Password(object):
    def __init__(self, url, pwd):
      self.url = url
      self.pwd = pwd
      self.count = 10

    # int(对象名)会自动调用
    def __int__(self):
        return  int(self.count)

    def __float__(self):
        return  float(self.count)

p1 = Password('www.baidu.com', 'westos')
print(int(p1))
print(float(p1))

五、索引与切片

例:

class Student(object):
    def __init__(self,name,scores):
        self.name = name
        self.scores = scores
    def __getitem__(self, item):
        print(item,type(item))
        return self.scores[item]
    def __setitem__(self, key, value):
        self.scores[key] = value
    def __delitem__(self, key):
        del self.scores[key]
liming = Student('liming',[100,89,100,70])
#索引值的获取
print('索引值的获取')
print(liming[0])
print(liming[1])
#索引值的修改
print('索引值的修改')
liming[0] = 79
print(liming[0])
#索引值的删除
print('索引值的删除')
del liming[0]
print(liming[0])
print('切片操作')
print(liming[:2])
#切片修改
liming[:2] = [1,2,3]
print(liming.scores)
#切片删除
del liming[:2]
print(liming.scores)

六、重复、连接与成员操作符

例:

class Student(object):
        def __init__(self,name,scores):
            self.name = name
            self.scores = scores
        def __mul__(self, other):
            return [i*other for i in self.scores]
        def __add__(self, other):
            return self.scores + other.scores
        def __contains__(self, item):
            return item in self.scores

liming = Student('liming',[100,90,100])
#进行重复操作
print(liming*3)
#连接操作
xiaohong = Student('xiaohong',[1,2,3])
print(xiaohong + liming)
#成员操作符
print(100 in liming)
print(1 in liming)
print(2 in xiaohong)

七、循环

例:

class Student(object):
    def __init__(self,name,scores):
        self.name = name
        self.scores = scores
    def __iter__(self):
        return iter(self.scores)
liming = Student('liming',[100,90,100,80])
for item in liming:
    print(item)

八、with语句安全上下文

例:

class Myopen(object):
    def __init__(self,name,mode='r'):
        self.name = name
        self.mode = mode
    def __enter__(self):
#当with语句进入并开始执行的时候,执行之后的内容需要一个返回对象,在执行结束后关闭或者执行其他的操作
        self.f = open(self.name,self.mode)
        print('正在打开文件........',self.mode)
        return self.f
    def __exit__(self, exc_type, exc_val, exc_tb):
#当with执行结束时,做什么操作。
        self.f.close()
        print('正在关闭文件......')
with Myopen('passwd') as f:
    print(f.read())

九、魔术方法汇总

基本的魔术方法
有关属性的魔术方法
比较操作符
算法运算符
反运算
增量赋值运算
一元操作符
类型转换
上下文管理(with语句)
容器类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值