python面向对象基础

来源:互联网 发布:淘宝网高跟靴 编辑:程序博客网 时间:2024/05/28 20:18

类变量:所有对象公用的属性

析构函数:

在实例释放、销毁的时候执行的,通常用于做一些收尾函数,比如关文件

私有属性:

在属性名前加两个下划线就是私有属性了

私有方法:

在方法名前加两个下划线就是私有方法了

继承

多继承当中,py2经典类是按深度优先来继承的,新式类是按广度优先来继承的

py3 经典类和新式类都是同一按广度优先来继承的

# Author:dancheng#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 sleep(self):        print("%s is sleeping..." % self.name)    def talk(self):        print("%s is talking..." % self.name)class Relation(object):    def __init__(self, n1, n2):        print('init in relation')    def mak_friends(self, p1):        print("%s is making friends with %s" %(self.name, p1.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 一出生2就有钱了%s money' %(self.name, self.money))    def piao(self):        print('%s is piaoing ..... 20s ' % self.name)    def sleep(self):        People.sleep(self)        print('man is sleeping')class Woman(People):    def get_birth(self):        print('%s is born a baby...' % self.name)    def sleep(self):        print('a Woman is sleeping....')w1 = Woman('dan', 11)# w1.get_birth()# w1.sleep()m1 = Man('dancheng', 12, 10)# m1.eat()# m1.piao()# m1.sleep()m1.mak_friends(w1)


继承实例讲解:

描述一个学校讲师和学员的关系

# Author:danchengclass School(object):    def __init__(self, name, addr):        self.name = name        self.addr = addr        self.students = []        self.teachers = []    def enroll(self, stu_obj):        print('为学员%s 办理注册手续' %stu_obj.name)        self.students.append(stu_obj)    def hire(self, staff_obj):        print('为老师%s 办理入学手续' % staff_obj.name)        self.teachers.append(staff_obj)class SchoolMember(object):    def __init__(self, name, age, sex):        self.name = name        self.age = age        self.sex = sex    def tell(self):        passclass Teacher(SchoolMember):    def __init__(self, name, age, sex, salary, course):        super(Teacher, self).__init__(name, age, sex)        self.salary = salary        self.course = course    def tell(self):        print('''            --- info of Teacher:%s ---            Name:%s            Age:%s            Sex:%s            Salary:%s            Course:%s        '''%(self.name, self.name, self.age, self.sex, self.salary, self.course))    def teach(self):        print('%s is teachering course [%s]' % (self.name, self.course))class Student(SchoolMember):    def __init__(self, name, age, sex, stu_id, grade):        super(Student, self).__init__(name, age, sex)        self.stu_id = stu_id        self.grade = grade    def tell(self):        print('''            --- info of Student:%s ---            Name:%s            Age:%s            Sex:%s            Stu_id:%s            Grade:%s        '''%(self.name, self.name, self.age, self.sex, self.stu_id, self.grade))    def pay_tuition(self, amount):        print('%s has paid tution for $%s' %(self.name, amount))school = School('dancheng', '吉林建筑大学')t1 = Teacher('dancheng', 21, 'F', 10000000, 'web')t2 = Teacher('xinyu', 22, 'M', 100000, 'java')s1 = Student('baolei', 22, 'F', 100, 'python')s2 = Student('sun', 10, 'M', 10002, 'python')#t1.tell()#t2.tell()school.hire(t1)school.enroll(s1)school.enroll(s2)school.teachers[0].teach()for stu in school.students:    stu.pay_tuition(4000)

多态

一种接口,多种实现。

允许将子类类型的指针赋值给父类类型的指针

# Author:danchengclass Animal(object):    def __init__(self, name):  # Constructor of the class        self.name = name    def talk(self):  # Abstract method, defined by convention only        raise NotImplementedError("Subclass must implement abstract method")class Cat(Animal):    def talk(self):        print('%s: 喵喵喵!' % self.name)class Dog(Animal):    def talk(self):        print('%s: 汪!汪!汪!' % self.name)def func(obj):  # 一个接口,多种形态    obj.talk()c1 = Cat('小晴')d1 = Dog('李磊')func(c1)func(d1)

静态方法

只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性

class Dog(object):    def __init__(self, name):        self.name = name    @staticmethod   #实际上和类没有什么关系,用类名调用    def eat():        print('%s is eating' %('ss'))d = Dog("hhh")d.eat()Dog.eat()

类方法

只能访问类变量,不能访问实例变量

# Author:danchengclass Dog(object):    name = 'dancheng'    @classmethod    def eat(self):        print('%s is eating' %(self.name))d = Dog()d.eat()

属性方法

把一个方法变成一个静态属性

1

# Author:danchengclass Dog(object):    name = 'dancheng'    @property        #attribute    def eat(self):        print('%s is eating' %(self.name))d = Dog()d.eat

2

# Author:danchengclass Dog(object):    def __init__(self, name):        self.name = name        self.__food = None    @property        #attribute    def eat(self, food):        print('%s is eating %s' %(self.name, food))    #定义一个属性    @property  # attribute    def eat(self):        print("%s is eating %s" % (self.name, self.__food))    #修改属性    @eat.setter    def eat(self, food):        print("set to food:", food)        self.__food = food    #删除属性    @eat.deleter    def eat(self):        del self.__food        print("删完了")d = Dog('dog')d.eat = '包子'del d.eat