美文网首页
Python 练习-面向对象编程

Python 练习-面向对象编程

作者: 庭阶 | 来源:发表于2019-01-08 17:59 被阅读0次

    1.类和实例

    class Student(object):#定义类
        def __init__(self,name,score):#初始化函数,定义类的对象属性,在定义实例时不能传入空参数
            self.name=name#属性,name,外部可以访问和改变属性
            self.score=score#属性,score,外部可以访问和改变属性
    
        def print_score(self):#定义类的方法,打印成绩
            print('%s:%s' % (self.name,self.score))
    
        def get_grade(self):#定义类的方法,打印成绩等级
            if self.score>=90:
                return 'A'
            elif self.score>=60:
                return 'B'
            else:
                return 'C'
            
    bart=Student('Bart Simpson',59)
    print('bart.name',bart.name)#打印实例bart的名字(外部访问)
    print('bart.score',bart.score)#打印实例bart的成绩(外部访问)
    print(bart.name,bart.print_score())#通过实例bart,调用方法print_score(),打印名字和成绩
    print(bart.name,bart.get_grade())#通过实例bart,调用方法print_score(),打印成绩等级
    
    

    2.访问限制:__gender 私有化参数属性,get_gender():获取private 参数,set_gender()修改private 参数

    class Student(object):
        def __init__(self,name,gender):
            self.name=name #共有参数,外部可以直接访问和修改
            self.__gender=gender#__gender:通过2个下划线将属性私有化,private,外部无法访问,bart.__name 用法已经不能直接访问
    
        def get_name(self):
            return self.name
        
        def get_gender(self):#通过get__gender 方法,外部代码可以获取name 
            return self.__gender
        
        def set_gender(self,gender):#通过set__gender 方法,允许外部代码修改gender,在方法中可以对参数做检查,避免无效参数
            if gender=='male'or gender=='female':
                self.__gender=gender
            else:
                raise ValudeError('invalid character')
            
    
    bart=Student('Bart Simpson','male')
    print(bart.name,bart.get_gender())#通过get_gender()才能获取gender
    if bart.get_gender() != 'male':
        print('test failed!')
    else:
        bart.set_gender('female')#外部代码修改性别为female
        if bart.get_gender() != 'female':
            print('test failed!')
        else:
            print('test successfully!')
    
    print(bart.get_name(),bart.get_gender())
    
    

    3.继承和多态

    继承:子类获得父类全部功能,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
    动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。Python 动态语言 VS Java 静态语言

    class Animal(object):
        def run(self):
            print('Animal is running...')
    
    class Dog(Animal):#继承类Animal
        def run(self):
            print('Dog is running ...')#覆盖父类的run 方法,打印 Dog is running,体现了多态性
    
        def eat(self):
            print('Eating meat....')#子类可以增加方法
    
    class Cat(Animal):#继承类Animal
        def run(self):
            print('Cat is running ...')
    
    
    dog=Dog()#dog 既是Dog类型,也是其父类Animal 类型
    cat=Cat()
    print(dog.run())
    print(cat.run())
    print('dog is Dog?',isinstance(dog,Dog))
    
    
    #动态语言的鸭子特性,即使定义在类外,只要传入的对象有run 方法:
            
    def run_twice(animal):
        animal.run()
        animal.run()
    
    
    a=run_twice(Animal())
    b=run_twice(Dog())
    print(a)
    print(b)
    

    4.获取对象信息

    4.1.type() :判断对象类型,返回对应的Class类型

    能用type()判断的基本类型也可以用isinstance()判断:

    4.2 isinstance()

    image.png

    并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:


    image.png

    总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。

    4.3.dir()

    如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法。配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态。

    
    class MyObject(object):
        def __init__(self):
            self.x=9
        def power(self):
            return self.x*self.x
    obj=MyObject()
    
    print('hasattr(obj,\'x\')',hasattr(obj,'x'))#有属性'x' 吗
    print('hasattr(obj,\'y\')',hasattr(obj,'y'))#有属性'y' 吗
    setattr(obj,'y',19)#设置一个属性‘y'
    print('hasattr(obj,\'y\')',hasattr(obj,'y'))#有属性'y' 吗
    print('getattr(obj,\'y\')',getattr(obj,'y'))#获取属性'y'
    print('obj.y=',obj.y)#获取属性'y'
    
    
    print('getattr(obj,\'z\')',getattr(obj,'z',404))#获取属性'z',如果没有返回赋予的默认值404
    
    f=getattr(obj,'power')#获取属性'power',并赋予给f,f 只想power()
    print(f)
    print(f())#调用power()
    

    5.实例属性和类属性

    优先级:实例属性>类属性
    注意:
    1)实例属性属于各个实例所有,互不干扰;
    2)类属性属于类所有,所有实例共享一个属性;
    3)不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性

    class Student(object):
        count=0#类属性‘count’
        def __init__(self,name):
            self.name=name
            Student.count+=1#每添加一个实例,类属性'count'+1
        
    
    bart=Student('Bart')
    print(Student.count)
    

    相关文章

      网友评论

          本文标题:Python 练习-面向对象编程

          本文链接:https://www.haomeiwen.com/subject/prrvrqtx.html