Python面向对象之类的成员

  Python面向对象的编程过程中,我们为类实例化了对象,并通过对象指针来访问类中对应的资源,那么这些资源大体分为三大部分,分别是字段、方法和属性,我们将这三大块统称为类的成员。

一、字段

  字段可以分为静态字段、动态字段,下面通过代码展示类中的两种字段

class MyClass:
    # 静态字段,属于类,多个对象共用一个静态字段
    leader = "abuve"
 
    def __init__(self):
        # 动态字段,属于对象,也可以叫普通的字段,每个对象都会有自己独有的动态字段
        self.name = "kevin"

  动态字段在类的实例化过程中很常见,通过self为每个对象封装属于自己特有的数据,但如果类中全部采用动态字段,也会遇到一些不合理的弊端,例如下面代码:

class Company:
    def __init__(self, dept, leader):
        self.company_name = "Center"
        self.dept = dept
        self.leader = leader  
          
    def ...
    
if __name__ == "__main__":    
    it_dept = Company("IT", "Abuve")
    hr_dept = Company("HR", "Kevin")

  我们通过动态字段方式为对象封装了自己独有的数据,但是这里发现公司名称company_name都为“Center”,不管创建哪个部门的对象,公司名称是不变的,我们知道动态字段存放在对象中,这样每个对象就都包含了一份company_name字段,这无疑增加了程序对内存的开销,因此更合理的方式应该使用静态字段,代码如下:

class Company:
    company_name = "Center"

    def __init__(self, dept, leader):
        self.dept = dept
        self.leader = leader    
        
    def ...
    
if __name__ == "__main__":
    it_dept = Company("IT", "Abuve")
    hr_dept = Company("HR", "Kevin")

同时在字段的调用方式上,我们也要遵循一些规则:
1、静态字段,属于类,通过类来调用访问
2、动态字段,属于对象,通过对象来调用访问

对于上述代码,我们通过下面的方式访问其中的字段数据:

print it_dept.deptprint 
hr_dept.leaderprint 
Company.company_name

如果通过对象访问静态字段同样可以访问到数据,因为对象也是通过对象指针指向了自己的类,对象中没有的数据最终也会去类中查找,但是这样的调用方式并不合理。

# 通过对象调用,同样访问到了类的静态字段
print it_dept.company_name

在字段前加入两个下划线,可以将该字段设置为私有字段,例如:

class MyClass:
    def __init__(self, name):
        self.__name = name 
        
    def show(self):
        print self.__name
        
if __name__ == "__main__":
    object = MyClass("Abuve")    # 通过对象无法访问到私有字段
    print object.__name    # 私有字段通过类的内部方法访问
    object.show()    # 通过类名前加入下划线的方式同样可以访问到
    print object._MyClass__name

最后一种方式通过类名前加入下划线的方式同样访问到了私有字段,但多数情况下尽量不要用这种方式进行访问。

二、方法

  在Python面向对象编程中,方法的调用最为常见,分为动态方法(普通方法)、静态方法、类方法,下面通过代码展示。

class MyClass:
    def __init__(self, name):
        self.name = name 
        
    # 普通方法
    def show(self):
        return self.name 
        
    # 静态方法
    @staticmethod
    def detail(name):
        print ‘%s is good person.‘ %name 
        
    # 动态方法
    @classmethod
    def show_detail(cls):
        cls.detail(‘Kevin‘) 
        
if __name__ == "__main__":
    object = MyClass("Jack")
    p_name = object.show()
    MyClass.detail(p_name)
    MyClass.show_detail()

与字段一样,方法的调用上依然要遵循一些规则。
1、普通方法,由对象调用
2、静态方法,由类调用
3、类方法,属于静态方法的一种,通过类来调用,执行的时候会自动将类名传递进去,因此要有一个默认的接收参数。

静态方法依然也可以通过对象指针来访问到,但是这样调用并不合理,之所以将这种稍微特殊的方法写到类中,也是因为其与该类具备一定的相关性。

三、属性

  如果说字段属于左派、方法属于右派,那么属性就属于中立派,因为它即具备方法的功能,同时又可以通过字段的方式来访问,下面为一段包含属性的代码段。

class PageSet:
    def __init__(self, count, page_size):
        self.count = count
        self.page_size = page_size 
        
    # 通过装饰器将page_num变为属性,对象调用时不需要再加括号
    @property
    def page_num(self):
        page_count, remainder  = divmod(self.count, self.page_size)    
            
        if remainder == 0:
            return page_count
        else:
            return page_count + 1
        
if __name__ == "__main__":    
    # 传入条目总数,以及单页size大小
    page_tools = PageSet(108, 10)    
    # 像访问字段一样执行了page_num方法
    print page_tools.page_num

  上面的代码实现了一个分页设置,我们通过装饰器property将page_num方法变为属性,那么该方法在被对象调用时,就像访问字段一样,不需要再加括号了。此时我们只实现了通过字段的方式来访问方法,通过下面的代码,我们也可以为属性调用相关的赋值、删除动作。

class PageSet:
    def __init__(self, count, page_size):
        self.count = count
        self.page_size = page_size 
        
    @property
    def page_num(self):
        page_count, remainder  = divmod(self.count, self.page_size)        
        
        if remainder == 0:           
            return page_count       
        else:            
            return page_count + 1
 
    @page_num.setter
    def page_num(self, value):
        print value        
        print ‘This is set function.‘
 
    @page_num.deleter
    def page_num(self):
        print ‘This is delete function.‘
        
if __name__ == "__main__":
    page_tools = PageSet(108, 10)    
    # 调用property修饰属性
    page_tools.page_num    
    # 调用page_num.setter修饰属性
    page_tools.page_num = 12
    # 调用page_num.deleter修饰属性
    del page_tools.page_num

四、特殊成员

  特殊成员指函数两边都带有下划线的特殊方法,这些特殊方法为类提供独有的功能。

1、__init__ 
构造方法,这类方法最为常见,在我们实例化类的时候,就是通过__init__构造方法封装了对象的数据。

2、 __del__ 
析构函数,通过__del__函数构造特定功能,在为对象执行del操作时,可以自动调用该部分代码,在程序执行相关垃圾回收时,可以应用析构方法。

3、__doc__   
注释,通过对象,可以访问到__doc__函数中指定的注释内容。

4、__module__ 
通过该方法可以显示当前对象属于哪个模块。

5、__class__
通过该方法可以显示当前对象属于哪个类。

6、__call__ 
如果我们在类的实例化对象后面加括号时,会自动执行类中的call方法。

class MyClass:
    def __call__(self):
        print ‘This is something...‘
        
 if __name__ == "__main__":
    object = MyClass()
    object()

7、__str__
默认打印对象时,只能够显示内存地址,通过__str__可以显示想要返回的内容。

class MyClass:
    def __str__(self):
        return ‘This is text that I want to return...‘
        
 if __name__ == "__main__":
    object = MyClass()    
    print object

8、__add__
可以将两个对象中的内容进行相加。

class MyClass:
    def __init__(self, company, ceo):
        self.company = company
        self.ceo = ceo 
        
    def __add__(self, other):
        return "%s---%s" %(self.company, other.ceo)
 
obj1 = MyClass("A","Abuve")
obj2 = MyClass("B", "Kevin")
print obj1 + obj2

代码最终打印了 "A---Kevin"

9、__dict__ 
对象调用该方法,可以打印出所有封装的数据,类调用该访问可以打印出所有方法。

10、__getitem__、__setitem__、__delitem__
通过字典的方式操作对象,可以为其设置相应的执行动作。

class MyClass(object):
    def __getitem__(self, key):
        print ‘__getitem__‘,key 
        
    def __setitem__(self, key, value):
        print ‘__setitem__‘,key,value 
        
    def __delitem__(self, key):
        print ‘__delitem__‘,key 
        
if __name__ == "__main__":
    obj = Myclass()      
    result = obj[‘k1‘]   # 执行了__getitem__方法
    obj[‘k2‘] = ‘abuve‘  # 执行了__setitem__方法
    del obj[‘k1‘]   # 执行了__delitem__方法

11、__iter__
用于迭代器,返回一个可以被迭代的对象

class MyClass(object):
    def __iter__(self):
        return iter([1,2,3,4,5]) 
        
if __name__ == "__main__":
    obj = MyClass()    
    for i in obj:        
        print i

12、isinstance/issubclass
通过isinstance可以判断某个对象的类型,issubclass可以判断某两个类是否为继承关系

class Class1():
    pass
 class Class2(Class1):
    pass
 if __name__ == "__main__":
    obj = Class2()    # 判断obj的类型是否为Class2
    print isinstance(obj, Class2)    # isinstance同样也可以判断是否继承自父类
    print isinstance(obj, Class1)    
    print issubclass(Class2, Class1)
时间: 2024-10-12 07:37:03

Python面向对象之类的成员的相关文章

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 面向对象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()报错: Type

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