上次学习了一些关于类创建对象的知识,学习了类的概念,那么类如何定义才能发挥作用,我们需要继续学习。
类的定义
类和对象都是对现实生活中的事物或程序中的内容的抽象。生活中的事物,语言中的对象,实际上都可以概括为由两部分定义的东西:数据(或语言中的属性)和行为(或语言中的方法)。具有这两样东西,事物(对象)就变得有意义,因此,类的定义需要具有属性和方法。
在类的代码块里面,可以定义变量和函数,其中,定义的变量会变成所有实例的公共属性,也就是说所有用这个类创建的对象,都有以这个变量名为属性名的一项属性;类里面定义的函数叫方法,这些方法可以通过类里面所有的实例访问。这些类里面定义的属性和方法都是公共的,用这个类创建的所有对象都能访问。
class Jntm():
koutouchan = '你干嘛~哈哈~嗨哎呦'
anhao = '只因'
def zhuangbei(self):
print('背带裤')
kk = Jntm()
xjz = Jntm()
print(kk.anhao)
print(xjz.anhao)
print(kk.koutouchan)
print(xjz.koutouchan)
kk.zhuangbei()
xjz.zhuangbei()
只因
只因
你干嘛~哈哈~嗨哎呦
你干嘛~哈哈~嗨哎呦
背带裤
背带裤
要注意,定义方法和定义函数不太一样。调用函数的时候,定义了几个形参,就需要传输几个实参;但是调用方法的时候,会默认传递一个实参,这就要求定义方法的时候必须至少定义一个形参,比如上面的self。
属性和方法的查找
调用某属性的时候,Python会按照从当前对象到类的顺序依次查找,也就是说当前对象有这个属性名的属性就调用,没有才去类里面找这个属性名的属性,都没有就报错。也就是说,从效果上来讲,如果直接给了某个对象一个某属性名的属性值,那这个属性值会覆盖改对象在类里面的同属性名的属性值。
kk.anhao = '厉不厉害你坤哥'
print(kk.anhao)
print(xjz.anhao)
厉不厉害你坤哥
只因
另外,类对象和实例对象都能保存属性和方法,不过具体咋保存应该视情况而定。比如一些实例们共有的属性,那么保存到类中显然比较合适,而一些实例独有的则最好保存到实例里面。一般来讲,在编程中,属性多保存到实例里面,而方法保存在类对象里面。
如果用del删除对象的某个属性,那再查找的时候又会找到原先在类里面的同属性名属性。
del kk.anhao
print(kk.anhao)
只因
在方法中,无法直接访问类里面的属性,和闭包原理不太一样,但是仍然可以访问到外部的属性。
class Jntm():
koutouchan = '你干嘛~哈哈~嗨哎呦'
anhao = '只因'
def zhuangbei(self):
print('背带裤')
def zwjs(self):
print('%s大家好'% kk.who)
kk.who = '全民制作人们'
kk.zwjs()
全民制作人们大家好
然后,关于方法的参数的使用,之前讲到方法的调用会默认传递一个实参,默认传递的是第一个实参,而这第一个参数就是调用方法的对象本身,简而言之就是谁调用的这个默认实参就是谁,这就是上面定义方法的时候Python默认叫这个形参叫self的原因。于是,在方法中灵活调用对象的方式自然是用self去进行操作。
class Jntm():
koutouchan = '你干嘛~哈哈~嗨哎呦'
anhao = '只因'
def zhuangbei(self):
print('背带裤')
def zwjs(self):
print('%s大家好'% self.who)
kk.who = '全民制作人们'
xjz.who = '露出黑脚们'
kk.zwjs()
xjz.zwjs()
全民制作人们大家好
露出黑脚们大家好
也就是说用self.属性(方法)来灵活使用方法。