python:面向对象(类)

#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"
###类变量与实例变量
class Role:
n = 123#类变量,存放在类中,不存放在实例中,可用于节省空间
def __init__(self, name, role, weapon, life_value = 100, money = 15000):
#构造函数
#在实例化时做一些类的初始化工作
self.name = name#实例变量(静态属性),存放在类中
self.role = role
self.weapon = weapon
self.life_value = life_value
self.__money = money#私有属性,仅能在类的内部访问

def shot(self):#类的方法,功能(动态属性)
print("shooting...")

def got_shot(self):
print("%s:ah...,I have got shot..." %self.name)

def __show_money(self):#类的私有函数,仅能在类的内部访问
print("money:%s" % self.__money)

def buy_gun(self, gun_name):
print("%s just bought %s" % (self.name, gun_name))

def __del__(self):#析构函数、在实例释放、销毁的时候执行的,通常用于做一些收尾工作,如关闭一些数据库,关闭打开的一些文件
print("执行析构函数")

print(Role)

r1 = Role("samson", "police", "AK47")#把一个类变成一个具体对象的过程叫实例化
r1.got_shot()#Role.got_shot(r1)
r1.bullet_prove = True #给类添加属性,这是可以的

r2 = Role("r2", "police", "AK47")#把一个类变成一个具体对象的过程叫实例化
r2.got_shot()#Role.got_shot(r1)
print(r1.weapon)
del r1.weapon#删除属性

r1.n = 145#相当于r1中新增了一个实例变量,不影响类变量
print(r1.n, r2.n)#r2中的n值不变



#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"
#继承
#class People:#经典类
class People(object):#新式类
def __init__(self,name,age):
self.name = name
self.age = age

def eat(self):
print("%s is eating..." % self.name)

def talk(self):
print("%s is talking..." % self.name)

def sleep(self):
print("%s is sleeping..." % self.name)


class Relation(object):
def make_friends(self,obj):
print("%s is making friends with %s" %(self.name,obj.name))
class Man(People,Relation):#多继承
def __init__(self,name,age,money):
People.__init__(self, name, age)#经典类写法,与super(Man,self).__init__(name,age) 新式类写法一样
self.money = money
print("%s has %s dollars" %(self.name,self.money))
def shopping(self):
print("%s is shopping..." % self.name)

def sleep(self):#重构父类方法
People.sleep(self)
print("man is sleeping...")

m1 = Man("samson",23,10)
m1.eat()
m1.shopping()
m1.sleep()

m2 = Man("sun",24,20)
m1.make_friends(m2)
注意,关于经典类与新式类的继承顺序:python2中经典类是按深度优先继承(D的继承顺序为先B后A,再C),新式类中为广度优先(D的继承顺序为先B后C,再A);python3中经典类与新式类都是按广度优先来继承的


#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

#封装可以隐藏实现细节,使得代码模块化;继承可以拓展已存在的代码块(类);它们的目的都是为了--代码重用。而多态则是为了实现另一个目的--接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用"家谱"中任一类的实例的某一属性时的正确调用,简单点就是一种接口,多种实现
#Python不支持多态,但可以间接实现
#通过python模拟的多态
class Animal:
def __init__(self,name):
self.name = name

def talk(self):
raise NotImplementedError("Subclass must implement abstract method")#抛出异常

@staticmethod
def animal_talk(obj):
obj.talk()

class Cat(Animal):
def talk(self):
print("Meow!")

class Dog(Animal):
def talk(self):
print("Woof! Woof!")

d = Dog("wangcai")
c = Cat("xiaohei")

Animal.animal_talk(d)
Animal.animal_talk(c)















原文地址:https://www.cnblogs.com/cansun/p/8216091.html