本文会记录一些本人想记录的几个关于类的知识点

1.self

Python 的 self 相当于 C++ 的 this 指针,在Python中指代类对象。因为Python中万物皆可对象,在创建类的时候,Python中就会开辟出一块空间,指定该类为对象。与之相应的还有实例对象。实例对象就是就是创建类的实例化对象。实例对象可以有多个,但是类对象只有一个。

class A():  #执行完A()内的代码,类对象A就创建了
    pass

B = A() #创建实例对象B
C = A() #创建实例对象C
D = A() #创建实例对象D

self

class Test:
    def prt(self):
        print(self)
        print(self.__class__)


t = Test()
t.prt()
# <__main__.Test object at 0x000000BC5A351208> #指代的是就是Test这个类对象
# <class '__main__.Test'>

通过self就可对类对象中的相关属性进行相关操作了

class peple():
    def __init__(self, name):
        self.name = name

    def introduce(self):
        print("我叫%s" % self.name)

stu = peple("Allen")
stu.introduce()  #我叫Allen

2.类属性和实例属性

类对象中,但又不在方法中,创建的那些数据变量就是这个类对象的属性,属性是用来对 类对象 进行说明的。比如peple()这个类对象,其中就可以有name,age,sex等属性对其进行描述。实例化的时候,每个实例对象都拥有这些属性,一旦通过类 对象.类属性 进行修改,会达到一变全都变的效果,因为这些实例对象都源自类对象,实例对象们共享着类属性

实例属性,该属性在方法中,需要在创建的时候(实例化)对其进行操作(赋值)。该属性不同于类对象的共享,只隶属于对应的实例对象。

实例属性与类属性的区别:

实例属性就相当于局部变量。只能在对应的实例对象中起作用
类属性就相当于类里面的全局变量,可以和这个类的所有实例对象共享

实例属性与类属性的调用

类属性:类外面,可以通过实例对象.类属性类名.类属性进行调用。类里面,通过self.类属性类名.类属性进行调用
实例属性 :类外面,可以通过实例对象.实例属性调用。类里面,通过self.实例属性 调用

class ball():
    ori_name = "basketball"
    def __init__(self, name):
        self.new_name = name

    def introduce(self):
        print("ball.ori_name,这是%s" % ball.ori_name)
        print("self.ori_name,这是%s" % self.ori_name)
        print("self.new_name,这是%s" % self.new_name)

a= ball("football")  #创建对象a
a.introduce()
#ball.ori_name,这是basketball
#self.ori_name,这是basketball
#self.new_name,这是football

b = ball("soccer") #创建对象b
b.introduce()
#ball.ori_name,这是basketball
#self.ori_name,这是basketball
#self.new_name,这是soccer

ball.ori_name = 'ball' #修改 类对象.类属性,对所有实例对象都有影响
a.introduce()
b.introduce()
#ball.ori_name,这是ball
#self.ori_name,这是ball
#self.new_name,这是football
#ball.ori_name,这是ball
#self.ori_name,这是ball
#self.new_name,这是soccer

a.new_name  = 'new_ball' #修改 实例对象.实例属性,只对实例对象a有影响
a.introduce()
b.introduce()
#ball.ori_name,这是ball
#self.ori_name,这是ball
#self.new_name,这是new_ball
#ball.ori_name,这是ball
#self.ori_name,这是ball
#self.new_name,这是soccer

a.ori_name = 'ori_ball' # 修改 实例对象.类属性 ,因为a是通过ball类创建的,其只对a做了修改,而没有修改源头ball,所以只对 对象a的类属性有影响
a.introduce()
b.introduce()
#ball.ori_name,这是ball
#self.ori_name,这是ori_ball
#self.new_name,这是new_ball
#ball.ori_name,这是ball
#self.ori_name,这是ball
#self.new_name,这是soccer

3.私有

方法和属性的私有化,只需在其前方加上"__",两个下划线。私有化的只能通过公共公有的方法去访问,去进行相关操作。

class ball():
    __ori_name = "basketball"
    def __init__(self, name):
        self.new_name = name

    def introduce(self):

        print("self.ori_name,这是%s" % self.__ori_name,end=' ')
        print("self.new_name,这是%s" % self.new_name)

    def __introduce(self):
        print("self.ori_name,这是%s" % self.__ori_name)

    def set_ori_name(self, name):
        self.__ori_name = name
        self.__introduce()


a = ball('football')
a.introduce() # self.ori_name,这是basketball self.new_name,这是football

a.__ori_name = 'ori' #由于该属性为私有,修改无效
a.introduce() # self.ori_name,这是basketball self.new_name,这是football

a.set_ori_name('ori') # self.ori_name,这是ori

4.魔方方法

class ball():
    __ori_name = "basketball"
    def __init__(self, name):
        self.new_name = name

类似于ball()类中的__init__,这种左右两侧被双下划线包围的方法
这种方法有点类似于Java语言里面的 构造方法,在创建类的时候回自动运行,在退出的时候又会自己消除,又或者在进行其他方面的时候自动调用,比如实例属性之间的相加

这里说一下init和del,分别对应构造和析构函数

class ball():

    def __init__(self, name):
        self.new_name = name
        print("self.new_name,这是%s" % self.new_name)

    def __del__(self):
        print('%s game over'% self.new_name)

a = ball('football')
b=ball('soccer')
#self.new_name,这是football
#self.new_name,这是soccer
#football game over
#soccer game over

按照a,b的先后顺序,对__init__进行了调用。当程序结束时,又依次调用__del__