Python既支持函数式编程,也支持面向对象编程
一、类、方法、变量
Python中的类使用class
关键字声明,方法使用def
声明。
构造方法__init__(self)
用来构造对象,其中的self
即指一个引用,代表的是对象。
1、Animal类
#创建一个类
class Animal:
#构造方法,传入两个参数
def __init__(self,name,age):
self.name=name
self.age=age
#类的方法
def show(self):
print("你的名字是{0},今年{1}岁".format(self.name,self.age))
#实例化一个类,创建一个对象
dog=Animal("Tom",18)
dog.show()
你的名字是Tom,今年18岁
2、普通方法、私有方法、静态方法、类方法、成员变量、私有变量
1、普通方法:对象访问
2、私有方法:两个下划线开头,只能在类内部访问
3、静态方法:用 @staticmethod 装饰的不带 self 参数的方法叫做静态方法,类的静态方法可以没有参数,类和对象访问,不能和其他方法重名,不然会相互覆盖,后面定义的会覆盖前面的
4、 类方法: 默认有个 cls 参数,可以被类和对象调用,需要加上 @classmethod 装饰器。 不能和其他方法重名,不然会相互覆盖,后面定义的会覆盖前面的
5、多继承情况下:从左到右查找方法,找到为止,不然就抛出异常
#创建一个类
class Animal:
# 类变量
height="40cm"
#私有属性
__sex="female"
#构造方法,传入参数
def __init__(self,name,age):
self.name=name
self.age=age
#类的普通方法,只能被对象调用
def show(self):
print("你的名字是{0},今年{1}岁,身高{2},性别是{3}".format(self.name,self.age,self.height,self.__sex))
#内部调用
self.__display()
#私有方法
def __display(self):
print("这是我的私有方法,类的内部可以调用")
@classmethod
def hello(cls):
print("类方法,可以被类和对象访问")
@staticmethod
def helloworld():
print("无参数静态方法,使用类名调用")
#返回值
return "hello"
#实例化一个类,创建一个对象
dog=Animal("Tom",18)
dog.show()
#类变量
print(dog.height)
print(Animal.height)
print(dog.name)
Animal.hello()
Animal.helloworld()
你的名字是Tom,今年18岁,身高40cm,性别是female
这是我的私有方法,类的内部可以调用
40cm
40cm
Tom
类方法,可以被类和对象访问
无参数静态方法,使用类名调用
二、继承、封装、多态
面向对象三大特点:继承、封装、多态。子类是可以继承父类的公开属性及方法的,并且Python中是支持多继承的。封装提高了代码的可重用性。多态让代码更加灵活。
对Animal这个类我们删减一点代码,然后让他做父类,来看一个简单的例子。
#创建一个类
class Animal:
# 类变量
height="40cm"
#私有属性
__sex="female"
#构造方法,传入参数
def __init__(self,name,age):
self.name=name
self.age=age
#类的普通方法,只能被对象调用
def show(self):
print("你的名字是{0},今年{1}岁,身高{2},性别是{3}".format(self.name,self.age,self.height,self.__sex))
#内部调用
#继承这个Animal
class Cat(Animal):
def __init__(self,name,age,color):
#Animal.__init__(self,name,age)继承构造方法
super(Cat,self).__init__(name,age)
print(self.age)
#继承方法
def yes(self):
super(Cat,self).show()
self.ha()
def ha(self):
print("哈哈哈哈")
cat=Cat("Jack",10,"red")
cat.yes()
cat.show()
10
你的名字是Jack,今年10岁,身高40cm,性别是female
哈哈哈哈
你的名字是Jack,今年10岁,身高40cm,性别是female