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 = [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.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