Python面向对象(一)
1、类的创建
语法:class 类名(父类名)
eg: class Animals : Color=''; Age=0; Name=''; def getColor(self): return self.Color;
class Dog(Animals): __Sex = 'Man'; def say1(self,strname): # 调用父类方法 super().say1(strname); print(self.__Sex);
如果没有设置继承的父类,表示直接继承Python的顶层类object
2、属性和方法
在上面的Animals中,Color,Age,Name都是属性,默认是公开的,getColor是函数,也叫方法
3、Self的含义
Self表示对象本身,也就是类的一个实例。类的成员方法的第一个参数就是self,因为是形参,你也可以改成其他名字,但是不建议改,约定俗称就是self。通常在调用成员方法时,不要手动传入self,它有解释器自动传入。
4、魔法方法 :由Python解释器自动调用的一些内置方法。魔法方法比较多,再次只介绍最常用的2个方法。
4.1 __init__() 方法
此方法属于构造方法,在类实例化的时候由Python解释器自动去调用。
dog=Dog('白色',4,'Dog'); #创建了一个dog对象 Dog.say1('Xiao Hei');
在dog=Dog('白色',4,'Dog'); 这一行代码执行时,Python解释器将自动执行方法__init__(),并且会把白色,4,Dog这3个形参传递给__init()__
4.2 __str()__
def __str__(self): return ( ('颜色:%s,年龄:%d') % (self.Color,self.Age));
print(dog);
当我们直接调用类的实例时,python解释器就会直接调用方法__str__()。
5、访问控制权限:
默认情况,方法和属性都是公开的。当我们在方法或者属性的前面加上双下划线时,对应的方法和属性就是私有。只能在类的内部可以访问,实例化后,不能再访问了。
class Animals(object) : Color=''; Age=0; Name=''; __sex = 'male'; def __init__(self,Color,Age,Name): self.Color = Color; self.Age=Age; self.Name=Name; def Introduce(self): print( ('Name:%s,years:%d,Color:%s,Sex:%s') % (self.Name,self.Age,self.Color,self.__sex)); dog=Animals('白色',4,'Dog'); # dog.Introduce(); dog.__sex;
在这里访问属性__sex 将会抛出异常,私有属性不能在实例中访问
AttributeError: 'Animals' object has no attribute '__sex'
接下来我们变通下就可以访问了
class Animals(object) : Color=''; Age=0; Name=''; __sex = 'male'; def __init__(self,Color,Age,Name): self.Color = Color; self.Age=Age; self.Name=Name; def getSex(self): return self.__sex; def setSex(self,Sex): self.__sex = Sex; dog=Animals('白色',4,'Dog'); print(dog.getSex());
在这里,我们增加了对象属性__sex的Set,Get方法,这样我们就可以通过访问共有方法间接访问属性__sex。这种做法在其他语言中非常常见,将属性设置为私有,只能通过访问才能访问属性。对于方法也是如此,同样有公共和私有的区别,做法也是一样,就不在叙述了。
6、Python重载
这个问题的讨论就有点尴尬了,Python的重载就仁者见仁智者见智了。我个人认为,从形式上讲,Python是不存在重载的。在其他开发语言中,重载的定义是:函数名相同,参数类型或者参数数量不相同。从定义上我们就可以看出来,Python的参数是没有类型的,在参数数量上,Python有不定长参数,用列表,元祖,字典完全可以表示出来,并且,Python是根据函数名来区分的,当在同一个类中定义2个相同名称的函数,第二个函数会把第一个函数覆盖掉。所以我个人认为Python不需要重载,也不存在重载。当人这只是我个人的看法,如果有问题,欢迎大家联系我,我目前也是在学习的过程中,边学习边总结,博客只是记录我的学习过程。