美文网首页
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