前言

众所周知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

最后

好了关于类的常用魔法方法就是这些了。我们就讲到这,谢谢大家。