本文会记录一些本人想记录的几个关于类的知识点
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__