Python学习(六)
一、对象基本知识
1、dir内置函数
使用:
dir(变量名)
作用:查看变量对象内所有属性和方法,其中__方法名__表示的是python内置的方法和属性。
2、简单类的定义
方法:直接按照普通函数定义就可以
属性:需要在内置构造函数__init__中对属性进行定义
注意点:
(1)、在方法中self参数是不能少的,self是调用该方法的对象的引用
(2)、初始化方法 __init__ 在对象创建的时候会自动调用,该方法是专门用来定义一个类具有哪些属性的。当对象初始化的时候会先分配空间,然后调用该方法对对象进行初始化。
定义属性:self.属性名=属性值
(3)、__del__方法:当对象从内存中销毁的时候会调用该方法
(4)、如果使用print函数直接输出对象,那么得到的是对象的十六进制的地址和类,如果要得到对象的具体内容可以重新写函数__str__
但是,该函数必须返回一个字符串,也就是必须return,且必须是字符串。
注意:在类中的所有方法中self参数是不能省略的。
类定义的例子:
#例子一
class Person:
def __init__(self,n,w):
self.name = n
self.weight = w
def __str__(self):
#返回的必须是字符串
return ("%s的体重是%.1f"%(self.name,self.weight))
def run(self):
self.weight -= 0.5
def eat(self):
self.weight += 1
a = Person("小明",75.0)
a.eat()
a.run()
print(a)
#例子二
class HouseItem:
def __init__(self,n,a):
self.name = n
self.area = a
def __str__(self):
return "家具%s的面积是%.1f"%(self.name,self.area)
class House:
def __init__(self,t,ta,la):
self.type = t
self.tarea = ta
self.larea = la
self.item_list = []
def __str__(self):
cnt = len(self.item_list)
s_list = ""
if not cnt==0:
for i in self.item_list:
s_list += i.name+"\n"
else:
s_list = "现在还没有任何家具!"
return "户型:%s\n总面积:%.1f\n剩余面积:%.1f\n家具列表:%s" %(self.type,self.tarea,self.larea,s_list)
def add_item(self,item):
self.item_list.append(item)
self.larea -= item.area
house = House("复式楼",10,10)
print(house)
print("\n")
bed = HouseItem("席梦思",4)
print(bed)
print("\n")
chest = HouseItem("衣柜",2)
print(chest)
print("\n")
table = HouseItem("餐桌",1.5)
print(table)
print("\n")
house.add_item(bed)
print(house)
print("\n")
house.add_item(chest)
print(house)
print("\n")
house.add_item(table)
print(house)
注意注意:可以直接使用对象名.属性名的方式为对象增加属性,但是这种方式尽量少用,但是可以这样操作。
3、None
None:当定义对象的属性的时候,目前还不知道对象该属性的具体取值的时候,就可以将该值设置为None。
is方法:
而==比较的是值是否相等。
此外,需要注意的是,我们一般在判断对象的某初始值为None的属性是否被赋值过的时候,应该使用is Node来判断,虽然 ==None也是可以的,但是推荐使用is的判断方法。
4、私有属性和私有方法
在属性和方法前面加上两个下划线“__”就可以。
但是在Python中没有严格的私有属性和方法,通过使用_类名(只有一个下划线)私有属性(私有方法)就可以访问,这是因为Python就是这样处理私有属性和私有方法的:
__名称=》_类名__名称
二、类的继承
1、语法
在Python3中如果没有指定类的父类,会将object作为默认的父类,但是Python2不会,所以当没有指定的父类的回收,最好还是将父类指定为object。
#继承
class 类名(父类名):
pass
#当没有具体的父类的时候,最好将object作为父类
class 类名(object):
pass
2、父类方法的重写
3、父类的私有属性和私有方法
4、多继承
在Python中支持多继承,也就是有多个父类,语法:
class name(parent1,parent2……):
pass
多继承涉及的一个问题是当两个父类有同名的方法的时候,子类到底调用的是哪一个,这取决于该类的方法查找顺序,可以使用MRO函数进行查看。
但是当两个类有同名的函数的时候应当尽量避免同时继承这两个类。
5、多态
Python中的多态的关键是继承和重写父类的方法。
毕竟Python在申明变量的时候也不像C一样要申明类型,所以其多态也就不太像C。
三、类也是对象
在Python中所有的都是对象,因此类也是对象,但是是特殊的对象,该对象有以下的特点:
(1)、在Python运行的时候,类同样会被加载到内存
(2)、在程序运行时,类对象在内存中只有一份,使用一个可以创建出多个对象实例
(3)、除了封装实例的属性和方法之外,类也可以有自己的属性和方法
(4)、通过类名.的方式可以访问类的属性和方法
类的方法属性和实例的属性和方法在内存中的示例:
具体实例的属性是存在各实例的内存中,其方法则是存在类的内存中,只是将各实例的引用当做参数传递过去。
1、类属性
类属性一般记录的是与该类有关的特征,与具体的实例无关。
定义的方式:直接在类中使用赋值语句
属性的获取机制:类属性可以用类名进行访问,也可以用对象名进行访问,所以当使用对象名进行访问的时候,会首先在对象自身查找,如果没有再去找类属性。
注意:如果使用对象.类属性 = 值的赋值语句,那么并不会对类属性造成影响,而是会为对象新增一个属性。
2、类方法
语法:
@classmethod
def 类方法名(cls):
pass
(1)、第一个参数是cls,不能省略,但是通过类名.调用类方法,不需要传递cls参数
(2)、哪一个类调用的方法,方法内的cls就是哪个类的引用,当然也可以使用对象名进行调用,但是最好还是使用类名
(3)、在类方法内部可以直接访问类属性或者调用其他的类方法,使用cls可以访问类的属性和其他的类方法
3、静态方法
语法:
@staticmethod
def 静态方法名():
pass
特点:
(1)、即不需要访问实例属性或者调用实例方法
(2)、也不需要访问类属性和类方法
(3)、通过 类名. 的方法调用
方法综合练习:
4、总结
方法的采用:
(1)、实例方法:方法内部需要访问实例属性,或者既要访问类属性又要访问实例属性,因为类只有一个,可以通过类名.的方式访问到类属性
(2)、类方法:方法内部只需要访问类属性或者类方法
(3)、静态方法;不需要访问实例属性和雷属性
肖战!!!!!!