Python学习笔记 —— 类
2016-06-15 17:14
585 查看
Python是面向对象语言,自然也就有面向对象的一些属性,类,继承,实例自然也就有了,具体不做了解,只需要针对其与其他语言如
objective-C进行一些区别概述,找其不同点来学习。
类 :描述具有相同的属性和方法的对象集合。定义了该集合中每个对象所共有的属性和方法。 对象 :类的实例,通过类定义的数组结构实例化,包括两个数据成员(类变量和实例变量)和方法 变量: 类变量 :【与其他不同】类变量是在整个实例化的对象中公用的,定义在类中且在函数体外。类变量通常不作为实例变量使用。 实例变量 :定义在方法中的变量,只作用于当前实例的类。 方法 :类中定义的函数 继承 :继承一个基类的字段和方法 方法重写 :【继承前提】父类中继承的方法不能满足子类的需求,可以对其进行改写,称为方法覆盖或是重写。
类创建
格式:
class Animal: 'animal classf'
访问属性的方法:
getattr(obj,name[,default]) :访问对象的属性 hasattr(obj,name) :是否存在某一属性 setattr(obj,name,value) :设置一个属性,如果属性不存在,会创建一个新属性 delattr(obj,name) :删除属性【与其他语言区别】
例:
#!/usr/bin/python # -*- coding:UTF-8 -*- class Animal: 'animal class' #__doc__ 返回值 animalCount = 0 def __init__(self,name): self.name = name Animal.animalCount += 1 def count(self): print 'Total animal %d' % Animal.animalCount def display(self): print 'name:',self.name #创建两个对象 dog = Animal('Dog') cat = Animal('Cat') #调用方法 dog.display() cat.display() dog.count() #修改属性值&调用方式一 dog.name = 'Harri' #can update attribute dog.display() print 'dog\'s name',dog.name #修改属性值&调用方式二 setattr(cat,'name','Jeen') #可自己去添加属性,类似于runtime中的属性挂载 print 'cat name :',getattr(cat,'name') #删除name属性 delattr(dog,'name') print 'has attr dog.name',hasattr(dog,'name') #print dog.name #错误 提示无此属性 setattr(dog,'age','10') print dog.age
Python内置属性
1. __dict__ :类调用,则返回类属性,对象调用则返回对象属性
#如: >>>print '__dict__',Animal.__dict__ #输出 __dict__ {'count': <function count at 0x10b548758>, '__module__': '__main__', 'display': <function display at 0x10b548e60>, 'animalCount': 2, '__doc__': 'animal classf', '__init__': <function __init__ at 0x10b548140>} >>>print '__dict__',dog.__dict__ #输出 __dict__ {'age': '10'}
2. __doc__ :【类或对象】文档字符串,无论类或属性均返回
#如: print '__doc__',Animal.__doc__ #输出 __doc__ animal class
3. __name : 【类】只能类调用,返回类名
#如: print '__name__',Animal.__name__ #输出 __name__ Animal
4. __module__ :【类或对象】类定义所在模块,返回一致
#如: print '__module__',Animal.__module__ #输出 __module__ __main__
注: 类的全名
__main__.className,如果类位于一个导入模块
module中,那么
className.__module__等于
module
5. __base__ :类的所有父元素构成的元组
Python的对象销毁
与OC一样,使用的是引用计数这一技术,参例:
a = 40 #创建对象 b = a #增加40的引用 c = #增加40引用 del a #减少40引用 b = 100 #减少40引用 c[10] #减少40引用 此时计数为0便由解释器在适当时机销毁,【不是立刻销毁】
[b]类继承
语法:
class 派生类名(基类名): #基类名在括号中,基类是在类定义的时候,在元组中指明的。如果基类名比较多,则实现多继承 ‘description’
继承特点:
1. 基类的构造方法(__init__()不会调用),它需要在其子类中主动调用 2. 在调用基类时,需要加上基类的类名前缀,且需要带上self参数变量。【区别普通函数】 3. 查找方法的流程:先从子类(派生类)中查找,找不到再去基类中找
例:
#!/usr/bin/python # -*- coding:UTF-8 -*- class Person: #基类(父类) age = 0 def __init__(self): print '调用父类构造方法' def personMethod(self): print '调用了父类方法' def setAge(self,age): Person.age = age def getAge(self): print '父类属性',Person.age class Student(Person): #定义子类 def __init__(self): #注释掉此方法便会调用父类构造方法 print '调用子类构造方法' #Person.__init__(self) #只有这样才会调用父类构造方法,传参需要带上self def studentMethod(self): print '调用子类方法' s = Student() s.studentMethod() s.personMethod() s.getAge() s.setAge(20) s.getAge(); #输出: 调用子类构造方法 调用子类方法 调用了父类方法 父类属性 0 父类属性 20
判断继承关系
issubclass(sub,sup) :判断是否为继承关系,并不只是一级继承 isinstance(obj,Class) :判断是否为一个类或其子类的实例
方法重写:父类方法功能不够使用时
只需要在子类中定义与父类一样的方法名一样的参数即可;
如:
#!/usr/bin/python # -*- coding:UTF-8 -*- class Person: #基类(父类) def printMethod(self): print '调用了父类方法' class Student(Person): #定义子类 def printMethod(self): print '调用子类方法',',展示更多信息' s = Student() s.printMethod() #会直接调用子类方法
基础重载方法:
重写方法:
1. __init__(self[,args]) :构造函数 调用时机 obj = className(args) 2. __del__(self) :删除对象时 调用时机 del obj 或obj引用为0进 3. __repr__(self) :转换为供解释器读取的方式 调用时机 repr(obj) 4. __cmp__(self.x) :对象比较 调用时机cmp(obj,x) 5. __add__(self.other) :运算符重载 调用时机 obj1 + obj2
例:
#!/usr/bin/python # -*- coding:UTF-8 -*- class Person: #基类(父类) x = 10 y = 20 def printMethod(self): print '调用了父类方法' class Student(Person): #定义子类 def printMethod(self): print '调用子类方法',',展示更多信息' def __cmp__(self,other): return self.x - other.x def __add__(self,other): return self.x + other.x ,self.y + other.y s = Student() s2 = Student() setattr(s2,'x',15) print cmp(s,s2) #比较 print repr(s) print str(s2) print s + s2 #重载运算符
可重写del方法探究
__del__ : 当对象不再被使用时,__del__方法执行
例:
#!/usr/bin/python # -*- coding:UTF-8 -*- class Demo: def __init__(self,x=0,y=0): self.x = x self.y = y def __del__(self): class_name = self.__class__.__name__ print class_name, '销毁' d1 = Demo() d2 = d1 d3 = d1 print id(d1),id(d2),id(d3) del d1 del d2 del d3 #输出 4561976640 4561976640 4561976640 Demo 销毁
补充
私有属性: __private_attrs :两个下划线开头,声明该属性为私有,不能在类外部(包括实例话对象)被使用或直接访问。在类内部调用方式:self.__private__attrs. 类方法: 在类的内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,其必须包含一个参数self,且为第一个参数 私有方法: __private_method :两个下划线开头,声明方法为私有方法,不能在类外部调用,只能在内部调用 方式: self.__private_methods()
-
注: 1. 类中声明的私有变量不能在实例化对象中使用,如需要使用,需要用obj._ClassName__attri,这样在实例对象中便可以使用,不推荐 2. 声明定义私有方法时需要添加self参数【类方法标志】,但调用时不可以传入self【只能在本类调用】
如:
#!/usr/bin/python # -*- coding:UTF-8 -*- class Person: #基类(父类) x = 10 y = 20 def __sum(self,a,b): #声明一个私有方法 print a + b def printMethod(self): print '调用了父类方法' self.__sum(self.x,self.y) #注意因为私有方法只能在本类中调用,所以第一个参数self已经被省略了【一定要注意】 class Student(Person): #定义子类 def __init__(self,x = 20,y = 30): self.x = x self.y = y print '在子类中进行了初始化' def printMethod(self): print '调用了子类方法' Person.printMethod(self) s = Student() s.printMethod() #输出 在子类中进行了初始化 调用了子类方法 调用了父类方法 50
相关文章推荐
- Android Native 绘图方法
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例