复习打卡--0814魔术方法

魔术方法

在python中,以双下划线开头、双下划线结尾的方法我们称之为魔术方法。例如__init__

魔术方法是python内部定义好的,我们不需要去创建。

1.__new__方法和单例模式

__new__方法:Create and return a new object.创建对象时触发
class Hero(object):

    def __init__(self,name):    # 对对象进行初始化
        print("这是init方法")
        self.name=name

    def __new__(cls,*args,**kwargs):    # 创建对象
        print("这是new方法")
        return super().__new__(cls)  # 必须返回原方法 创建对象的功能。如果缺少改行,h1返回值为None

h1=Hero("musen")
print(h1.name)

  应用:

  1. 重写new方法,返回其他的类对象;

  2.单例模式: 通常类每次实例化都会创建一个对象,通过单例模式可以实现限制 一个类只创建一个对象共用;

  单例模式实现思路:

  1.创建一个类属性记录是否创建过对象;

  2.在__new__方法中对类属性做出判断:如果没有创建,就新建一个对象并修改1种属性值;如果创建过,直接返回已创建的对象;

class Myclass(object):
    ‘‘‘单例模式类‘‘‘
    instance=None

    def __new__(cls,*args,**kwargs):    # 创建对象
        if not cls.instance:
            cls.instance=object.__new__(cls)
            return cls.instance
        else:
             return cls.instance

h1=Myclass()
h2=Myclass()
h3=Myclass()
print(id(h1),id(h2),id(h3))

2.上下文管理器

  通过with实现,底层使用两个魔术方法:object.__enter__()、object.__exit__()。一个类中只要使用了这两个方法,那么该类就实现了上下文协议,就是一个上下文管理器;

  object.__enter__(self): 输入此对象运行时使用的相关上下文;

  object.__exit__(self,exc_type,exc_val,exc_tb):  参数:异常类型、异常值、异常回溯

class Myopen(object):

    def __init__(self,filename,mode,encoding):
        self.filename=filename
        self.mode=mode
        self.encoding=encoding
        self.f=open(self.filename,self.mode,encoding=self.encoding)

    def __enter__(self):
        return self.f  # 返回打开的文件

    def __exit__(self,exc_type,exc_val,exc_tb):
        self.f.close()  # 关闭文件     print(exc_type,exc_val,exc_tb) #当执行出错时,打印出错误信息
with Myopen("1.txt","r",encoding="utf8") as f:
    print(f.read())

  上下文管理器的应用举例:

class Testcase(Myopen,unittest.TestCase):

    def __init__(self,*args,**kwargs):
        Myopen.__init__(self,*args,**kwargs)
        self,*args,**kwargs.__init__(self,*args,**kwargs)
        print("__init__")

t=Testcase()

3.__call__方法 : 在对象使用括号时被触发,使类创建的对象像函数一样可以被引用

class Test(object):

    def __call__(self):
        print("触发了call方法")

t=Test()
t()  # 触发了call方法

4.__str__方法、__repr__方法

  __str__方法:print()、str()、format() 触发

  __repr__方法:交互环境>>>下直接输入变量时、repr转换对象时 触发;当找不到__str__方法,只有__repr__方法时,上述3种均触发__repr__方法

  应用:打印类的一些属性

class Hero(object):
    def __init__(self,name):
        self.name=name

    def __str__(self):
        return self.name

h=Hero(‘musen‘)
print(h)

5. 算术运算的实现

  __add__(slef,other): 相加  +,以+触发

  __sub__(slef,other): 相减  -

  __mul__(slef,other): 相乘 *

  __truediv__(slef,other): 定义真除法 /

  __floordiv__(slef,other): 定义整数除法 //

  __mod__(slef,other): 定义取余算法 %

class Mystr(object):

    def __init__(self,value):
        self.value=value

    def __str__(self):
        return self.value

    def __add__(self,other):   # self代表实例本身,other代表其他
        return Mystr(F‘{self.value}{other.value}‘)
  def __sub__(self,other):        return self.value.replace(other.value,‘‘)
s1=Mystr("aaa")
s2=Mystr("bbb")
print(s1+s2)

原文地址:https://www.cnblogs.com/qingyuu/p/12255570.html

时间: 2024-10-13 05:14:59

复习打卡--0814魔术方法的相关文章

PHP面向对象之魔术方法复习

魔术方法复习 2014-9-2 10:08:00 NotePad++ By jiancaigege 飞鸿影~========================= 1.__construct() 构造方法 用于类实例化时自动运行的方法 常用于初始化成员属性值等 2.__destruct() 析构函数 用于类销毁时自动运行的方法 常用语销毁资源.关闭资源等 3.__set($param,$value) 用于给对象中非公有的成员属性设置值时自动调用的方法 例如: 1 public function __

python中类的魔术方法

目的:学习python中class的magic methods,提高编程效率. 环境:ubuntu 16.4   python 3.5.2 在学习class是一定会接触到它的magic methods,比如常用__init__,形式都是前后有双下划线.除了这个必须的,还有其他有用的方法,下面大概的介绍一下. 运算魔法方法: __add__ 用作 + __sub__ 用作 - __mul__ 用作 * __truediv__用作/ __floordiv__用作// __mod__用作% __pow

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

静态、抽象类、加载类、魔术方法等

静态  static关键字 普通成员普通成员是属于对象的 静态成员静态成员是属于类的 普通方法里面可以调用静态成员静态方法里面不能调用普通成员self关键字 在类里面代表该类 普通类 class Ren { public $name="张三"; public static $zhongzu; //静态成员 普通方法 function Say() { echo self::$zhongzu."你好"; } 静态类 static function Run() { ech

PHP中的魔术方法总结

最近买了部安卓的手机,google nexus5 系统是安卓4.4.2. 刚到手就发现链接wifi有问题,一直在获取ip(obtaining ip...)和验证.试过恢复出厂 重启 各种都不管用,只有设置静态ip才可以,但是不能一直这样子呀!! 查了下路由器,路由器已经分配了地址.所以最大可能就是安卓手机上拿到这个地址没有成功写入配置文件,为什么没有写入呢,就是权限的问题了,不明白为什么google会出现这个错误. 因为不熟悉安卓系统,所以查了好几天,终于在一个外国网站上发现了下面这个解决办法,

php魔术方法

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload 1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 __get( $property ) 当调用一个未定义的属性时访问此方法 __set( $pro

魔术方法

特点: 以--(两个下划线)开头的类方法,会自动被调用. 常见的魔术方法有15个: __set(变量名称,变量值)(不需要有返回值):在给不可访问属性赋值时,__set() 会被调用. 标准形式不能改: 需要设置值和值的类的属性名称, 魔术方法必须是公共的(Public),且不能定义为静态的(static).被访问的属性名称,必须是字符串.当在类的外部调用不能直接访问不能直接访问的属性时,该函数会自动被调用. property_exists(字符串形式的类名或要检查的对象,属性名字)- 检查对象

PHP 魔术方法

一.php中的魔术方法 php在面向对象编程时有一些特殊的方法,会在特定的时机自动调用,我们将这类方法称为魔术方法. 二.常见的魔术方法及功能 1.构造函数 __construct():当类被实例化为一个对象时自动调用,主要用来完成对象生成时初始化属性. 例: 1 <?php 2 3 class App{ 4 5 public function __construct(){ 6 7 echo 1111; 8 } 9 10 } 11 12 $app=new App();//自动输出111 2.析构

PHP中的面向对象OOP中的魔术方法

一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在new一个新对象时自动调用此函数 二.PHP中都有那些魔术方法,以及它们的作用:1.__construct():构造函数,new对象时自动调用 eg: class Person{ public $name; public $age; function __construct($name,$age){ $