面向对象中的双下方法

1、__str__与__repr__方法

class Animal:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def f(self):
        print("这是父类的方法")
class Persion(Animal):
    country = "chinese"
    def __init__(self,name,age,sex):
        Animal.__init__(self,name,age)
        self.sex = sex
    def eat(self):
        print("这是子类中的方法")
    # def __str__(self):
    #     return "这是子类中的str"
    def __repr__(self):
        return "这是子类中的repr"
a = Persion("小明",18,"sex")
print(a)
print(str(a))
print(repr(a))
print(a.__repr__())
print(a.__str__())
print(‘%s‘%a)
print(‘%r‘%a)

这两个双下方法可以改变字符串的显示,打印一个对象,本质上是调用__str__方法,如果没有找到,就找__repr__方法,再找不到,就调用父类中的,__repr_是__str__的备胎,__str__不是__repr_的,再父类中有一个__str__方法,一旦调用,就返回调用这个方法的对象的内存地址。调用__str__一共有四种方法。

2、__del__析构函数 再删除一个对象之前进行一个收尾工作

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

class Persion(Animal):
    country = "chinese"
    def __init__(self,name,age,sex):
        Animal.__init__(self,name,age)
        self.sex = sex
    def eat(self):
        print("这是子类中的方法")
    # def __str__(self):
    #     return "这是子类中的str"
    def __repr__(self):
        return "这是子类中的repr"
    def __del__(self):
        print("我要开始删除对象了")
a = Persion("小明",18,"sex")
del  a
print(a)

del既执行了这个方法,也删除了变量,先执行__del__,在执行删除,再删除一个对象之前做收尾工作。

3、__call__  对象后面加括号执行  即:对象() 或者 类()()

class Foo():
    def __call__(self, *args, **kwargs):
        print("打印call函数")
a = Foo()
a()
Foo()()

4、__new__构造函数  实例化对象

调用__init__方法之前,首先调用__new__方法,返回一个实例self ,若__new__方法没有返回当前类cls的实力,那么init方法不会被调用。因为类每一次实例化产生的过程都是通过__new__来控制的,所以我们可以通过__new__方法简单的实现实例化。

通过__new__方法方法实例化一个对象,并开辟一块地址空间,__new__方法return实例,init方法就不会被调用

class Animal:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def f(self):
        print("这是父类的方法")
class Persion(Animal):
    country = "chinese"
    _instance = False
    def __init__(self,name,age,sex):
        Animal.__init__(self,name,age)
        self.sex = sex
        print("init方法")
    def eat(self):
        print("这是子类中的方法")
    def __new__(cls, *args, **kwargs):
        if cls._instance :
            return cls._instance
        cls._instance = object.__new__(Persion)
        return cls._instance
a = Persion("小明",18,"sex")
a.cloth = "小花袄"
print(a)
print(a.__dict__)
b = Persion("小红",19,"nv")
print(b)
print(b.__dict__)
print(a.__dict__)

单例模式只会产生一个实例,就是第一个实例,之后的实力化,相当于对之前对象的属性重新命名。

5、__eq__方法   父类中的eq方法默认比较的是内存地址

class Animal:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def f(self):
        print("这是父类的方法")
class Persion(Animal):
    def __init__(self,name,age,sex):
        Animal.__init__(self,name,age)
        self.sex = sex
    def eat(self):
        print("这是子类中的方法")
    def __eq__(self,other):
        if self.name == other.name:
            return True
        else :
            return False
a = Persion("小明",18,"sex")
b =Persion("小明",43,"女")
print(a == b)

通过比较名字来判断是不是相等

应用:100个学生记录,其中有的名字和性别相同,年龄不同,认为名字和性别相同就是同一个人,根据这个去重

6、__delitem__   __delattr__  __setitem__   __getitem__

class Foo:
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item):
        print("执行getitem方法了")
        # print(self.__dict__[item])
        return None

    def __setitem__(self, key, value):
        print("执行setitem方法了")
        self.__dict__[key]=value
    def __delitem__(self, key):
        print(‘del obj[key]时,我执行‘)
        self.__dict__.pop(key)
    def __delattr__(self, item):
        print(‘del obj.key时,我执行‘)
        self.__dict__.pop(item)

f1=Foo(‘sb‘)
f1[‘age‘]=18
f1[‘age1‘]=19
del f1.age1
del f1[‘age‘]
f1[‘name‘]=‘alex‘
print(f1.__dict__)
print(f1["agge"])

原文地址:https://www.cnblogs.com/weidaijie/p/9860591.html

时间: 2024-07-30 07:52:04

面向对象中的双下方法的相关文章

面向对象:反射和双下方法

面向对象:反射和双下方法 1.元类type type:获取对象从属于的类 class A: pass obj = A() print(type(A)) print(type('abc')) print(type([1,2,3])) python中一切皆对象,类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类都是由type元类(构建类)实例化得来的 type 与 object 的关系 object类是type类的一个实例,object类是type的父类. print(type

Python面向对象之反射,双下方法

一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) class Foo:    f = '

面向对象之: 反射和双下方法

目录 一, 反射 二, 函数VS方法 三, 双下方法 一, 反射 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性 python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数,下列方法适用于类和对象(一切对象,类本身也是对象) # 对实例化对象的示例 class Foo: f = '类的静态变量' def __init__(self, name, age): self.name = name sel

面向对象之 元类 , 反射 , 双下方法

1.元类 type type元类,又称为构建类,python中一切皆对象,类也可以理解为对象,python中自己定义的类,以及大部分内置类,都是由type元类实例化得来的 元类type class A: pass obj = A() print(type('abc')) #<class 'str'> print(type([1,2,3])) #<class 'list'> print(type((22,33))) #<class 'tuple'> print(type(

Python面向对象反射,双下方法

一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 对实例化对象的示例 class Foo

面向对象的反射和双下方法(魔术方法)

反射: 通过字符串操作对象相关属性. 1 class Text: 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 def func(self): 6 print(123) 7 def func1(self): 8 return self 9 10 text = Text("小明",18) 11 print(hasattr(text,"func")) # 查看对象是否具有属性或方

面向对象之:元类,反射, 双下方法

[TOC] 1.元类 class A: pass obj = A() print(type('abc')) # <class 'str'> print(type([1,2,3])) # <class 'list'> print(type((22,33))) # <class 'tuple'> # type 获取对象从属于的类 print(type(A)) # <class 'type'> print(type(str)) # <class 'type'

python之路-双下方法

双下方法 定义: 双下方法是特殊方法,他是解释器提供的,由双下线加方法名加双下划线 __方法名__具有特殊意义的方法 双下方法主要是Python源码程序员使用的,元编程 我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更有益于我们阅读源码 1.__len__ 计算长度 s = 'nihaoashuaige' print(len(s)) #len作为内置函数,部分数据类型调用它的时候就会返回其长度,那是什么让这个函数起了这样的作用呢 #看一下字符串的str类的内容里有__len__方法,所

反射 双下方法

一 : 元类 type Type 获取对象从属的类 class A: pass print(type('abc')) # <class 'str'> print(type([1,2,3])) # <class 'list'> print(type((22,33))) # <class 'tuple'> python 中一切皆对象,类在某种意义上也是一个对象,python 中自己定义的类,以及大部分内置类,都是由 type元类实例化得来的 type 与 object 的关