作为一个脚本语言,没想到也是面向对象的,今天看了一下Python的类,跟Java的大同小异,语法上很多不同,但是功能上大差不差,不多说,来看看
先看看关于面向对象的几个概念:
概念
类(class) :封装一些变量和方法的一个对象的描述。实际就是包含了一些变量和方法。
类变量:Python的类变量,相当于Java的类静态变量,类的所有对象共用的变量。
实例变量:只能作用于当前类的实例的变量,对比于类变量,实例变量每一个类的实例对象都不同。
对象:类的实例化就是一个对象。
实例
自己都觉得概念讲不清楚,还是看看实例易懂,直接上实例:
class Test(object):
var = 'hello test'
def __init__(self, arg):
super(Test, self).__init__()
self.arg = arg
def f1(self):
print('f1')
test = Test('test')
print('test.arg = '+test.arg)
print('Test.arg = '+Test.var)
print('test.var = '+test.var)
Test.f1(test)
test.f1()
输出为:
test.arg = test
Test.arg = hello test
test.var = hello test
f1
f1
在此解释一下
Test就是类,test就是Test类的实例。
var就是类变量,直接用Test类名就能调用,也能用test实例调用
arg就是实例变量,是能实例test调用。
f1是有参数(self)的,所以是实例方法,可以实例调用,也可以类名调用,但是要传入一个实例对象参数
如果f1是一个不带参数的函数,那么只能类名调用,实例不能调用,实例调用默认传入了一个实例对象的参数,这点对比Java来说是不同的,对于一个Java出身来说,还真他妈的不习惯
__init__(self, arg):
这是一个构造方法,self是对象自己,arg就是参数。
当类实例化是,也就是当执行test = Test('test')
时,构造函数会自动调用
self并不是关键字,可以用其他的关键字替代,重要的是函数的第一个参数,它一定是对象自己,self只是用这习惯而已。
继承
Python也是可以类继承类的,并且还可以多继承。
单继承:例子中class Test(object):
就代表Test类继承了object类
多继承:class Test2(Test,Test1):
就代表了Test2继承了Test,Test1,当Test,Test1中有相同的变量,函数是,如果没有被子类Test2复写,那么会默认执行第一个继承的类Test的变量或者函数,切记。
类属性与方法
__fun1()
:双下划线开头的,是类的私有属性,外面不能直接调用的,只能类的内部用self.__fun1()
调用。
但是想如下的专有方法,也是__
开头的,__init__
确可以类外面调用,其他的好像又不行,这是奇葩了,与是我们不得不记住这些个专有的函数。
其中比较重要的两个init,del
,当构造时,a = A(),del a
时,会执行这两个方法。其他的方法我也没弄清楚什么时候执行,下次专门去查查,介绍介绍。
类的专有方法:
__init__
: 构造函数,在生成对象时调用
__del__
: 析构函数,释放对象时使用
__repr__
: 打印,转换
__setitem__
: 按照索引赋值
__getitem__
: 按照索引获取值
__len__
: 获得长度
__cmp__
: 比较运算
__call__
: 函数调用
__add__
: 加运算
__sub__
: 减运算
__mul__
: 乘运算
__div__
: 除运算
__mod__
: 求余运算
__pow__
: 称方
大家注意了没有,继承时的构造函数,可以super(Test, self).__init__()
去调用,也可以object.__init__(self)
调用,那这两种方法有什么区别呢?
- 单继承时super()和init()实现的功能是基本一样的
class Base(object):
def __init__(self):
print ('Base create')
class A(Base):
def __init__(self):
print ('creat A ')
Base.__init__(self)
class B(Base):
def __init__(self):
print ('creat B ')
super(B, self).__init__()
base = Base()
a = A()
b = B()
这段代码的输出:
Base create
creat A
Base create
creat B
Base create
想知道其中的区别,请期待明天的学习笔记。。。实际上是今天太晚了,身体重要啊
部分知识来自博客:http://www.pythontab.com/html/2016/pythonjichu_1205/1108.html