Python 面向对象4-特殊成员

1.__call__

  类后面加()表示对象,执行__init__方法,对象后面加()执行__call__方法

class Foo:

    def __init__(self,name):
        self.name = name
        print ("init func")

    def __call__(self):
        print ("call func")

obj = Foo("Alex")
obj()

如果不定义__call__方法,那么执行obj()报错:

TypeError: ‘Foo‘ object is not callable

如果定义了__call__方法,那么在对象后面加()则执行__call__方法。

2.__str__

  有一段代码如下:

class Foo:

    def __init__(self,name):
        self.name = name
        print ("init func")

    def __call__(self):
        print ("call func")
# class Bar(Foo):
#
#     def f3(self):
#         print (self.name)

obj = Foo("Alex")
print (obj)结果:  <__main__.Foo object at 0x013349B0>

我们想打印一个对象(obj)的内容,但是返回了一个类的内存地址,通过__str__方法可以实现这样的需求

class Foo:

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

    def __call__(self):
        print ("call func")

    def __str__(self):
        return self.name

obj = Foo("Alex")
print (obj)结果:  Alex

如果__init__方法中有多个字段,那么也可以利用字符串的拼接将结果返回回来

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")

    def __str__(self):
        return "%s - %s" %(self.name,self.age)

obj = Foo("Alex",18)
print (obj)结果:  Alex - 18

class Foo:

    def __init__(self,name,age):        self.name = name        self.age = age

    def __call__(self):        print ("call func")

    # def __str__(self):    #     return "%s - %s" %(self.name,self.age)

obj = Foo("Alex",18)# print (obj)ret = str(obj)print (ret)结果:  <__main__.Foo object at 0x01D7F810>

如果没有__str__方法,那么str(返回)的类对象的内存地址,如果定义了__str__方法,在执行str(obj)的时候,自动调用__str__方法。

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")

    def __str__(self):
        return "%s - %s" %(self.name,self.age)

obj = Foo("Alex",18)
# print (obj)
ret = str(obj)
print (ret)结果:  Alex - 18

3.__add__ 

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")
def __add__(self, other):
        return "%s - %s" %(self.name,other.age)
obj1 = Foo("Alex",18)
obj2 = Foo("Lily",15)

ret = obj1 + obj2
print (ret)结果:  Alex - 15

__add__方法是对两个对象之间做加法,在做加法的时候系统自己调用该方法。

4.__dict__

  

__author__ = ‘Alex‘
#coding:utf-8

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")

    # def __str__(self):
    #     return "%s - %s" %(self.name,self.age)

    def __add__(self, other):
        return "%s - %s" %(self.name,other.age)
obj1 = Foo("Alex",18)
obj2 = Foo("Lily",15)

print (obj1.__dict__)
print (obj2.__dict__)
print (Foo.__dict__)结果:  

  {‘age‘: 18, ‘name‘: ‘Alex‘}
  {‘age‘: 15, ‘name‘: ‘Lily‘}
  {‘__init__‘: <function Foo.__init__ at 0x013641E0>, ‘__doc__‘: None, ‘__module__‘: ‘__main__‘, ‘__call__‘: <function Foo.__call__ at 0x01364228>, ‘__add__‘: <function Foo.__add__ at 0x013640C0>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Foo‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Foo‘ objects>}

5.__getitem__、__setitem__、__delitem__

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")

    # def __str__(self):
    #     return "%s - %s" %(self.name,self.age)

    def __add__(self, other):
        return "%s - %s" %(self.name,other.age)

    def __getitem__(self, item):
        return item

    def __setitem__(self, key, value):
        pass

    def __delitem__(self, key):
        pass

obj1 = Foo("Alex",18)

ret = obj1[‘aaa‘]
print (ret)

obj1[‘bbb‘] = 456
ret1 = obj1[‘bbb‘]
print (ret1)

del obj1[‘bbb‘]
print (obj1[‘bbb‘])

对象的切片访问形式,例如obj1[1:4]


class Foo:

    def __init__(self,name,age):        self.name = name        self.age = age

    def __call__(self):        print ("call func")

    # def __str__(self):    #     return "%s - %s" %(self.name,self.age)

    def __add__(self, other):        return "%s - %s" %(self.name,other.age)

    def __getitem__(self, item):        if type(item) is str:            print (item)            return item        else:            print (item.start)            print (item.stop)            print (item.step)

    def __setitem__(self, key, value):        print (key.start)        print (key.stop)        print (key.step)        print (type(key),type(value))

    def __delitem__(self, key):        print (type(key))        print (key.start)        print (key.stop)        print (key.step)

obj1 = Foo("Alex",18)# ret = obj1[‘aaa‘]# ret = obj1[1:4:2]# obj1[1:4] = [11,22,33,44,55,66]del obj1[1:4]# print (ret)# print (ret)## obj1[‘bbb‘] = 456# ret1 = obj1[‘bbb‘]# print (ret1)## del obj1[‘bbb‘]# print (obj1[‘bbb‘])

6.__iter__

class Foo:

    def __iter__(self):
        return iter([11,22,33])

obj = Foo()
for item in obj:
    print (item)结果:  11  22  33

如果一个对象可以被迭代,那么就可以执行for循环。被循环的对象默认调用__iter__方法,返回值必须是一个可以被迭代的对象。

class Foo:

    def __iter__(self):              #生成器生成一个可迭代的对象
        yield 11
        yield 22

obj = Foo()
for item in obj:
    print (item)结果:  11  22
时间: 2024-12-18 21:00:19

Python 面向对象4-特殊成员的相关文章

Python面向对象之类的成员

Python面向对象的编程过程中,我们为类实例化了对象,并通过对象指针来访问类中对应的资源,那么这些资源大体分为三大部分,分别是字段.方法和属性,我们将这三大块统称为类的成员. 一.字段 字段可以分为静态字段.动态字段,下面通过代码展示类中的两种字段 class MyClass:     # 静态字段,属于类,多个对象共用一个静态字段     leader = "abuve"       def __init__(self):         # 动态字段,属于对象,也可以叫普通的字段

python 面向对象和类成员和异常处理

python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial diameter),极直径(polar diameter)''' def __init__(self,name,eqDiameter,poDiameter): self.name=name self.eqDiameter=eqDiameter #赤道直径 self.poDiameter=poDiamet

Python 学习笔记 - 面向对象(类成员)

上一篇学习了Python面向对象的3大特性,封装,继承和多态,这一篇继续学习类成员,包括字段,方法,属性以及他们的修饰符. 1.字段 字段分为静态字段和普通字段.静态字段属于类,而普通字段属于对象,因此静态字段在内存中只保存一份,而普通字段在每个对象中都保存了一份.定义的时候静态字段定义在类的范围里面,而普通字段定义在方法里面. 例如: >>> class Foo:     # 字段(静态字段)     CC = 123     def __init__(self):         #

python面向对象之类成员

一.概述 上篇<python面向对象OOP>介绍了python面向对象的基础初级入门部分,提到了类的定义,使用,类的三大特性;经典类,新式类在查找时的区别等,有了前面的基础,本文接着描述面向对象中类成员;先整体描述下,类中的成员分以下几部分: #类成员  #字段(属性):      普通字段  属于对象,保存在对象中,只能通过对象访问      静态字段  属于类,保存(一份)在类中(所有对象共享的字段属性),执行时可以是类访问也可以是对象访问  #方法:      普通方法  保存在类中,又

python面向对象程序设计(类成员)第二节

python 面向对象程序设计(类成员) 目录: (1)        类成员和实例成员 (2)        公有成员和私有成员 (3)        方法 (一)类成员与实例成员: 实例属性属于实例(对象),只能通过对象名访问. 类属性属于类,类名或对象名都可以访问,属于类的数据成员是在类中所有方法之外定义的. class Car:     price = 1000   #类属性     def __init__(self,c):         self.color = c car1 =

Python 面向对象class(2)

Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们先来简单的了解下面向对象的一些基本特征. 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定

python 面向对象(进阶篇)

上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象

python 面向对象 进阶篇

在上篇<python面向对象>中,简单介绍了python中面向对象的基本知识 在这篇博客中,详细介绍python类的成员,成员修饰符,类的特殊成员. 类的成员 类的成员分为三种:字段,方法和属性 所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 字段 字段包括普通字段和静态字段.静态字段,保存在类中.普通字段,保存在对象中. class FOO: country = “中国

Python面向对象编程-封装

1引言 你点击了桌面上的Chrome图标,一个浏览器窗口出现了,输入网址就可以在Internet世界愉快玩耍.这一切是怎么实现的呢?Chromium这个多进程的程序是如何启动各个进程的呢?浏览器主进程(界面进程)启动了哪些线程?如何启动的呢?这些问题一直萦绕在心头,一起来看看源代码吧.本文主要针对Chromium for Mac的源代码,其它操作系统大同小异. 2背景知识 浏览器作为一个应用程序,是以进程的形式运行在操作系统上的.首先,Chromium是一个多进程的应用程序,我们需要了解Chro