pythonclassinit
❶ python class用法理解
python中class用法是什么呢?不知道的小伙伴来看看小编今天的分享吧!
1、class的定义及常用称呼:
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。
对象:它是类的实例化。
方法:指类中定义的函数。
2、类对象支持两种操作:
属性引用和实例化。
属性引用的语法:obj.属性
类实例化的语法:obj = 类名()
类中方法的调用:obj.方法名()
3、举例:
例1
class student(object): #自定义一个类student
def speak(self): ## 哪个对象调用了这个方法,self就是那个对象;可以把self理解为一个形参
print(%s 说:我今年%s岁 % (self.name, self.age))
john = student() #类student 实例化一个对象john
john.name = 约翰 # 给对象添加属性
john.age = 19
john.speak() # 调用类中的 speak()方法
此时的输出为
约翰 说:我今年19岁
例2
class student(object): # 定义构造方法 有init,有别于自定义类
def __init__(self, n, a): #__init__() 是类的初始化方法;它在类的实例化操作后 会自动调用,不需要手动调用;
self.name = n
self.age = a # 设置属性
def speak(self): # 定义类中的普通方法
print(%s 说:我今年%s岁 % (self.name, self.age))
john = student(约翰,19) #类student 实例化一个对象john
john.speak() # 调用类中的 speak()方法
最后的输出同上个例子
在python中使用__开头 并以__结尾的方法,称之为魔法方法;
init(self) 是类的初始化方法,也称构造方法,是一种特殊的魔法方法; init(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里;
常用到的魔法方法还有:str(self) 、 del(self)等。
4、类的继承以及super,self的使用:
子类继承父类,即子类拥有了父类的属性和方法。
python中类的初始化都是__init__()。所以父类和子类的初始化方式都是__init__()
但是如果子类初始化时没有这个函数,那么它便调用父类的__init__();(对应例input1)
如果子类种调用了父类的init,但自己又定义了自己的init,那么就会覆盖父类的初始化函数,只显示子类自己的初始化。(对应例input2)
input1:
class Animal(object):
def __init__(self):
self.name = 我是父类
class Panda(Animal):
def __init__(self):
super().__init__() #使用super的方式来显示调用父类的__init__()函数
super(Panda, self).__init__() # 第二种super初始化的方式
if __name__==__main__:
panda = Panda() #实例化Panda
print(panda.name)
output1:
我是父类
input2:
class Animal(object):
def __init__(self):
self.name = 我是父类
class Panda(Animal):
def __init__(self):
super().__init__()
self.name = panda
if __name__==__main__:
panda = Panda()
print(panda.name)
output2:
panda
2. self和super的区别:
(1) self是首先调用自身的方法如果自身没有再去父类中找;super是直接从父类中找方法
(2)self是类(可以理解为形参),super是预编译指令
反正要继承父类,直接上super就ok了
input3:
class Animal(object):
def __init__(self):
self.name = 我是父类
def A(self): #父类中的A方法
print(父类的A方法)
class Panda(Animal):
def __init__(self):
super().__init__()
self.myname = panda
def A(self): #子类中的A方法
print(子类的A方法)
def B(self):
self.A() #self调用A
super().A() #super调用A
if __name__==__main__:
panda = Panda()
panda.B() #通过B函数来调用A方法,查看self和super的区别
output3:
子类的A方法#我们说过self是先从自身找方法,没有再去父类找
父类的A方法#而super则是直接从父类中找
❷ python关于class的问题
对象构造后第一个调用的函数,在python里面实例的属性是可以动态构建的,在类里面定义的属性是类属性,不是实例属性,定义实例自己的属性的最好地方是__init__函数里面。
比如
class TEST():
class_attr #类属性,通过TEST.class_attr调用,如果用instance.class_attr调用实际上是声明类另一个实例属性,与之前的TEST.class_attr不是一个东西了
def __init__(self,other):
self.class_attr #实例属性,与之前的那个属性处于不同的名字空间了,不是一个东西。
self.other=other
总之,__init__可以用来声明实例属性,以及进行必要的初始化。
希望能解决您的问题。
❸ python class的问题
这个程序没有遵从python的惯例,所以可能对你的理解产生一些问题。
__init__(b, c)和d(b)是class A的方法,按照惯例,第一个参数应该写为self,因为类在调用它的方法的时候会自动把实例作为第一个参数传到它的方法。所以,第一个参数b,其实调用时候的class A的实例。
b.c = c,其实就是给当前实例添加一个属性c,c就是传进来的参数
同理,d()函数的第一个参数当然可以是其他,只是代表当前实例而已
for循环中它是循环初始化时传进来的参数,因为在初始化时把该参数记录到了属性c中,所以是b.c
所以,class A改写为如下代码,可能你就明白了
classA(object):
def__init__(self,c):
self.c=c
defd(self):
foreinself.c:
printe
第九行就是为了获得class A的实例,所以传入初始化参数['一', '二', '三', '四']来初始化以获得实例
因为之前说过了,class中的方法第一个参数是会自动传入为当前实例,所以调用时第一个参数是不需要传的,因此调用d()函数时,不需要带参数
这个程序只是定义了一个类A,它初始化是需要传入参数c,并且参数c是可以循环的。类A提供了方法d,用来打印参数c的内容
之后的几行代码只是实例化了类A,并进行了方法调用而已