Python学习笔记 —— 类
来源:互联网 发布:nginx做负载均衡 编辑:程序博客网 时间:2024/06/05 04:46
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 attributedog.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 = [b] #增加40引用del a #减少40引用b = 100 #减少40引用c[10] #减少40引用 此时计数为0便由解释器在适当时机销毁,【不是立刻销毁】
类继承
语法:
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.ageclass 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.ys = 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 = d1d3 = d1print id(d1),id(d2),id(d3)del d1del d2del d3#输出4561976640 4561976640 4561976640Demo 销毁
补充
私有属性: __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
0 0
- Python学习笔记——新式类
- python学习笔记——类
- python 学习笔记——类
- python学习笔记——类
- Python学习笔记 —— 类
- Python学习笔记——定制类
- python 学习笔记——python metaclass 元类
- Python学习笔记(七)——Python 类
- python 学习笔记——python globals()
- Python学习笔记 — 函数
- Python学习笔记—钱珺
- python学习笔记—输入输出
- OpenCV—Python 学习笔记
- Python学习笔记(—):初识python
- 【笔记】Python学习笔记 ——1
- python学习笔记--类
- python学习笔记---类
- python学习笔记:类
- Linux kernel的中断子系统之(六):ARM中断处理过程
- Scala伴生类Class和伴生对象Object的区别
- 紫书_第八章_高效算法设计_8.2.2——快速排序
- Carousel在IE8兼容性问题
- android MK文件简介
- Python学习笔记 —— 类
- ionic 卡片滑动效果
- Tcp 端口扫描器 (Python)
- c#treeview选中节点
- 浅析CSS——元素重叠及position定位的z-index顺序
- Mysql无法创建外键的原因
- TS协议解析第四部分(adaptation field)
- 集合框架总结
- 在unity中将图片保存在移动平台下(Android和IOS)