文章目录
面向对象编程(oop)
- oop是一种程序设计思想,把对象作为程序的基本单元,一个对象包含数据和操作数据的函数
- 在python中,所有数据类型都被视为对象,也可以自定义对象,自定义对象数据类型就是面向对象中类的概念
python类和方法中的self
python中的class本质上是一个变量,只不过它里面的函数和属性我们可以自定义,所有的方法调用都要由类本身来执行,而对象名反而成为了参数,看起来就是python在和我们玩文字游戏,举个例子:
s = student()
这是条创建对象的语句,python在执行时做了一个变换
student.__init__(s)
同样的
s.coding('python')
在执行时变成了:
student.coding(s,'python')
上述可以理解为什么类中的方法必须要带self参数了
创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2)
,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2)
这就是Python的self的原理了。即使你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数,虽然我们在实例化调用的时候不用理会这个参数不用给它赋值。
class ABC(object):
x='x in ABC'
print('ABC- x:',x)
# self.x='x in ABCself'
# print(self.x)
def aa(self,x):
x='x in aa'
print('aa - x:',x)
print('self.x:',self.x)
print('self is:',self)
t=ABC()
t.aa("")
'''
输出结果:
ABC- x: x in ABC
aa - x: x in aa
self.x: x in ABC
self is: <__main__.ABC object at 0x0334F290>
'''
self指向于类本身,写方法时加上self参数,表示构造一个只属于这个类的方法,调用类方法后,selft指代的就是这个类创建的实例对象。
因此,在方法块中的某变量(如例中的x)前加上前缀“self.”,表示引用这个类(例中的ABC)的某属性,如果类代码中没有该属性,就会报错(比如本例中如果没有 x=‘x in ABC’ ,就会报:AttributeError: ‘ABC’ object has no attribute ‘x’)。
- self另一个作用是区分全局变量函数和类中的变量函数。
a = 1
def say():
print '调用了全局方法'
class people:
a = 100
def say(self):
print '调用了类的方法'
def do(self):
say()
self.say()
print 'a = ' , a
print 'self.a = ' , self.a
p = people()
p.do()
运行结果
调用的全局方法
调用了类的方法
a = 1
self.a = 100
面向对象术语
1、类(class)与对象(object)
类(class)是用来描述具有相同属性(attribute)和方法(method)对象的集合,对象是类的具体实例,比如学生都有名字和分数,他们有着共同的属性。
2、方法(method)
- 类里面的函数,用来区别类外面的函数,用来实现某些功能
- 在类内部,使用def关键字为类定义一个方法,与一般函数定义不同,类方法必须包含参数self且为第一个参数
- 创建实例才能调用类的方法
- 在类中定义方法的形式和函数差不多,但其不称为函数,而是叫方法。方法的调用需要绑定到特定的对象上(通过self.),而函数不需要。
类的专有方法
init 构造函数,在生成对象时调用
del 析构函数,释放对象时使用
repr 打印,转换
setitem 按照索引赋值
getitem 按照索引获取值
len 获得长度
cmp 比较运算
call 函数调用
add 加运算
sub 减运算
mul 乘运算
div 除运算
mod 求余运算
pow 称方
class person():
def __init__(self,name,age,weight):
self.name = name
self.age = age
self.__weight = weight
def __cmp__(self):
pow_age = self.age.__pow__(2)
print(pow_age)
def __len__(self):
name_del = self.name.__len__()
print(name_del)
def __add__(self):
adds = self.age.__add__(self.__weight)
print(adds)
def infoma(self):
print('%s is %s weights %s'%(self.name,self.age,self.__weight))
print(person.__class__)
print(person.__repr__)
3、数据成员
类变量或者实例变量用于处理类及其实例对象的相关的数据。
4、方法重写
5、类变量(类属性:静态属性)
类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象
类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体(方法)之外。类变量通常不作为实例变量使用,类变量也称作属性
- 赋值:class里def外,通过变量名能被赋值;def里通过类对象即类名字的点运算变量名可被赋值
- 赋值:程序里,通过实例对象的点运算变量名可被赋值
- 千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
- 可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。
class student():
age = 0
name = 'stu'
# age,name是类变量
def __init__(self,age,name):
self.age = age
self.name = name
# 访问实例变量(用self.age self.name)
student1 = student(18,'hello')
print(student1.name)
# 打印实例变量,输出hello
print(student.name)
# 打印类变量,输出stu
6、实例变量(实例属性)
定义在方法中的变量,只作用于当前实例的类。
- 赋值:def里通过self.变量名能被赋值,不一定非在init里,其他已被调用的方法函数也可以
- 赋值:程序中,通过实例对象.变量名可被复制
- 实例变量访问属性时优先查找实例属性,实例属性优先级高于类属性
- 实例化之后,每个实例单独拥有的变量。
7、继承
8、实例化(Instrance)
创建一个类的实例,类的具体对象。
通常来说,新式类开始实例化时,”_ _ new _ _ “方法会返回cls(cls指代当前类)的实例,然后调用该类的”_ _ init_ _ “方法作为初始化方法,该方法接收这个实例(即self)作为自己的第一个参数,然后依次传入” _ _new _ _”方法中接收的位置参数和命名参数。
但是,如果”_ _ new _ _ “没有返回cls(即当前类)的实例,那么当前类的” _ _ init_ _”方法是不会被调用的。看下面的例子
1、new(cls,*args,**kwargs)
- "new()"方法在Python中是真正的构造方法(创建并返回实例),通过这个方法产生一个“cls”对应的实例对象,所以所"new()"方法一定要有返回。
- 如果__new__()没有返回cls的实例,那么新实例的__init__()方法将不会被执行
- 使用__new__()方法主要是为了允许不可变类型(如int,str,tuple)的子类定制实例。
def __new__(cls, *args, **kwargs):
# func_suite
return object.__new__(cls, *args, **kwargs)
2、init(self,*args,**kwargs)
- "init()"方法是一个初始化的方法,"self"代表由类产生出来的实例对象,"init()"将对这个对象进行相应的初始化操作。
class person(object):
tall = 180
hobbies = []
def __init__(self, name, age,weight):
self.name = name
self.age = age
self.weight = weight
def infoma(self):
print('%s is %s weights %s'%(self.name,self.age,self.weight))
Bruce = person("Bruce", 25,180)
Bruce.infoma()
9、多态
对不同类的对象使用同样的操作
10、封装
对外部世界隐藏对象的工作细节