定义类
class 类名:
赋值语句
赋值语句
.....
def语句定义函数
def语句定义函数
.....
例:
class testclass:
data = 100
def setpdata(self, value):
self.data = value
def showpdata(self):
print("data:", self.data)
x = testclass()
x.setpdata(123)
x.showpdata()
print(x.data)
类对象
类对象支持两种操作:属性引用和实例化。
- 属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
- 类对象创建后,类命名空间中所有的命名都是有效属性名。
类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
类有一个名为 __ init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:
def __init__(self,value):
self.data = value
类有一个名为 __del __() 的特殊方法(析构方法),该方法在实例对象回收时会自动调用,像下面这样:
def __del__(self):
del self.data
其他方法
观察以下例子:
class test:
def add(a, b):
return a + b
def add2(self, a, b):
return a + b
#通过类对象调用方法
print(test.add(2, 3)) #5
print(test.add2(2, 3, 4)) #7
#创建实例对象
x = test()
print(x.add2(2, 3)) #5
print(x.add(2, 3)) #报错
- 通过类对象调用方法,只需要记住参数个数,add2()方法中2传给了self,但是self并没有使用,所以计算结果仍为7
- 如果实例化对象,对象会和参数一同传递给方法,add()方法只有两个参数,所以报错
解释一下self
- self代表类的实例,而非类
- 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
- 通过实例对象调用方法时,当前实例对象作为一个参数传递进去
- self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
- self 不是 python 关键字,但是默认第一个参数
- 个人认为self也就是java中的this指针
继承
格式如下:
class 类名(父类名):
赋值语句
赋值语句
.....
def语句定义函数
def语句定义函数
.....
定义子类构造函数时注意添加:
#调用父类的构函
父类.__init__(self,n,a,w)
Python同样有限的支持多继承形式。多继承的类定义形如下例:
class 类名(父类名,父类名,父类名,父类名.....):
赋值语句
赋值语句
.....
def语句定义函数
def语句定义函数
.....
- 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
方法重写
- 子类重写你父类的方法
- super() 函数是用于调用父类(超类)的一个方法。
类属性与方法
类的私有属性
两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.属性名。
类的私有方法
两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.方法名。
class Site:
def __init__(self, name, url):
self.name = name # public
self.__url = url # private
def who(self):
print('name : ', self.name)
print('url : ', self.__url)
def __foo(self): # 私有方法
print('这是私有方法')
def foo(self): # 公共方法
print('这是公共方法')
self.__foo()
x = Site('syc', 'www.syc.com')
x.who() # 正常输出
x.foo() # 正常输出
x.__foo() # 报错
Python3 中类的静态方法、普通方法、类方法
- 静态方法: 用 @staticmethod 装饰的不带 self 参数的方法叫做静态方法,类的静态方法可以没有参数,可以直接使用类名调用。
- 普通方法: 默认有个self参数,且只能被对象调用。
- 类方法: 默认有个 cls 参数,可以被类和对象调用,需要加上 @classmethod 装饰器。
class Classroom:
@staticmethod
def fun():
print("静态方法")
@classmethod
def fun1(cls):
print("类方法")
def fun2(self):
print("普通方法")
if __name__ == '__main__':
x = Classroom()
Classroom.fun() #静态方法
Classroom.fun() #静态方法
x.fun2() #普通方法
类的专有方法:
- __init __ : 构造函数,在生成对象时调用
- __del __ : 析构函数,释放对象时使用
- __repr __ : 打印,转换
- __setitem __ : 按照索引赋值
- __getitem __: 按照索引获取值
- __len __: 获得长度
- __cmp __: 比较运算
- __call __: 函数调用
- __add __: 加运算
- __sub __: 减运算
- __mul __: 乘运算
- __truediv __: 除运算
- __mod __: 求余运算
- __pow __: 乘方