您的位置:首页 > 编程语言 > Python开发

[python自学笔记] 面向对象

2017-10-15 22:38 295 查看
面向对象的三个基本特征有封装,继承,多态;Java,C++都支持面向对象编程,下面用python语言演示面向对象的实现语法

1、私有方法和私有成员变量,封装

class Animal:
def __init__(self,name):
self.__name = name
self.age = 10
def getName(self):
return self.__name
def getAge(self):
return self.age
def __getInfo(self):
print(self.__name)
print(self.age)

def main():
animal = Animal("Tom")
# print(animal.__name) # 报错
print(animal.getName()) #Tom
print(animal.age) #10
print(animal.getAge()) #10
animal.__getInfo() # 报错

if __name__ == '__main__':
main()


在上面这个例子中,定义了Animal这个类,成员方法中第一个参数必须是self,相当于java里面的this指针,这个类的init方法是实例化的时候调用的,类似于Java里面的构造函数,常常用来构造对象,Animal类中有一个__name属性和age属性,其中name前面有两个下划线,表明这个属性是私有属性,不能被继承,只能在本类中使用,类似于Java中的private关键字,同理在方法名前加两个下换线也是表明私有方法。

2、类属性、类方法和静态方法

class Game:
#类属性
num = 0
#实例方法
def __init__(self):
#实例属性
self.name = "laowang"
#类方法
@classmethod
def add_num(cls):
cls.num = 100
#静态方法
@staticmethod
def print_menu():
print("----------------------")
print("    穿越火线V11.1")
print(" 1. 开始游戏")
print(" 2. 结束游戏")
print("----------------------")

def main():
game = Game()
#Game.add_num()#可以通过类的名字调用类方法
game.add_num()#还可以通过这个类创建出来的对象 去调用这个类方法
print(Game.num)
#Game.print_menu()#通过类 去调用静态方法
game.print_menu()#通过实例对象 去调用静态方法

if __name__ == '__main__':
main()


类属性是属于类本身的,不单纯属于某个对象的,相当于java的static关键字修饰,类方法必须有@classmethod修饰,而且第一个参数必须是cls,其实并不是非得是cls,只是一种规范,就像成员方法第一个参数是self,静态方法必须有@staticmethod修饰,方法中参数列表可以任意,可以不加self和cls,并且静态方法和类方法都可以通过实例对象调用也可以通过类名调用。但是类属性只能通过类名调用。

3、继承

class Animal:
def eat(self):
print("-----吃----")
def drink(self):
print("-----喝----")
def sleep(self):
print("-----睡觉----")
def run(self):
print("-----跑----")

class Dog(Animal):
def bark(self):
print("----汪汪叫---")

class Xiaotq(Dog):
def fly(self):
print("----飞----")


在定义类的时候在类名加一个小括号,里面写上父类的类名,就可以实现继承,如果实现多继承的话,就在小括号里面写多个类的名字,用逗号分隔开。

class Base(object):
def test(self):
print("----Base")

class A(Base):
def test1(self):
print("-----test1")

class B(Base):
def test2(self):
print("-----test2")

class C(A,B):
pass


C类是A和B的子类,相当于驴、马、骡子的关系,在C++也支持多继承,多继承最好保证父类的方法名不一样,免得子类调用的时候出现麻烦。

4、重写方法和调用父类方法

class Animal:
def eat(self):
print("-----吃----")
def drink(self):
print("-----喝----")
def sleep(self):
print("-----睡觉----")
def run(self):
print("-----跑----")

class Dog(Animal):
def bark(self):
print("----汪汪叫---")

class Xiaotq(Dog):
def fly(self):
print("----飞----")

def bark(self):
print("----狂叫-----")
super().bark()


Dog是Animal的子类,Xiaotq是Dog的子类,Xiaotq重写了Dog的bark方法,如果想使用父类的方法,使用super()访问父类方法。相当于java里面的super关键字。此外,所有的类都是Object类的子类,这和Java中是一致的。

5、多态

class Dog(object):
def print_self(self):
print("大家好,我是xxxx,希望以后大家多多关照....")

class Xiaotq(Dog):
def print_self(self):
print("hello everybody, 我是你们的老大,我是xxxx")

def introduce(temp):
temp.print_self()

def main():
dog1 = Dog()
dog2 = Xiaotq()
introduce(dog1)
introduce(dog2)

if __name__ == '__main__':
main()


当调用introduce方法的时候,出现了父类引用指向子类对象,仍然能够调用相应的方法,因为python是弱类型语言,等到执行的时候才会检查数据类型,能够实现多态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: