前言
众所周知python是一项面对对象的语言,我们定义类,然后类成了类对象,最终将他赋给实例对象。
类
我们先看一个简单的类,一个类分为两部分:对象和方法。
class Classi:
x=1
y=2##属性
def he(self,x,y):
print("x+y=",x+y)#方法
tt=Classi()
tt.he(1,2)
print(tt.x)
结果为:
x+y= 3
1
Process finished with exit code 0
类的定义类似于函数,不同的是类的属性是可以访问的,其他类似。那么他和函数的最大区别在哪呢,可以这莫说对于假设我们造一栋房子,那么函数可能只是其中一个个小家具的设计图,而类是一套房子的完美解决方案。
类的属性
与函数不同,类的属性可以分为可访问和不可访问。只要在属性前加–就可以让属性变的不可访问:
class mingzi2:
name="你猜"
__haha="我是你爸爸"
__mani="我是你爸爸"
def getname(self):
return self.__mani
def __init__(self,name="你猜"):
self.name = name
def xianshi(self):
print("我叫:" + self.name)
cai=mingzi2()
print(cai.name)
print(cai.__haha)
print(cai.haha)
结果
你猜
Traceback (most recent call last):
File "C:/Users/dell-pc/PycharmProjects/untitled/练习.py", line 13, in <module>
print(cai.__haha)
AttributeError: 'mingzi2' object has no attribute '__haha'
Process finished with exit code 1
可以看到haha不可被访问。
类的参数初始化__init__
既然函数可以传入参数,那么类可不可以呢。答案是确定的。我们可以通过__init__初始化参数。
class C:
def __init__(self,size=10):
self.size=size
C.size=3
print(C.size)
结果:
3
Process finished with exit code 0
类的继承与不可变类
首先我们来考虑一个问题str(“a”)是什么呐。其实他是一个实例对象,而str就是一个不可改变的类。这里我们来做一个尝试,继承不可改变类str,并且对他进行改变,改为传出的所有字符串都为大写。
class Capstrss(str):
def __new__(cls, string):##str不可改,所以用new
string=string.upper()
return str.__new__(cls,string)
a=Capstrss("accc")
print(a)
结果:
ACCC
Process finished with exit code 0
可以看出类的继承很简单,只需一个括号,而不可变类的重写只需要__new__。
有趣的例子
不知道大家在学习矩阵论的时候有没有遇到过这么一种题,说是重新定义一种算法,让加法不再是加,可能是乘。现在我们就通常过重新定义int的方法来实现加变成减,减变成加。
class newint(int):
def __add__(self, other):
return int.__sub__(self, other)
def __sub__(self, other):
return int.__add__(self, other)
print(newint("3") - newint("18"))
结果:
21
Process finished with exit code 0
最后
好了关于类的常用魔法方法就是这些了。我们就讲到这,谢谢大家。