当前位置: 移动技术网 > IT编程>脚本编程>Python > python-6面向对象编程

python-6面向对象编程

2018年05月12日  | 移动技术网IT编程  | 我要评论

苟仲武,淘宝装修教程,深圳市副市长张文

1-类和实例

class Student(object):
    def __init__(self, name, score):# _init__方法的第一个参数永远是self,表示创建的实例本身
        self.name = name
        self.score = score
    def print_score(self):
        print('nams:%s, score:%s'%(self.name,self.score))
    def get_grade(self):
        if(self.score >=90):
            return 'A'
        elif(self.score >= 60):
            return 'B'
        else:
            return 'C'

#调用   
stu = Student('qinzhongbao',79)
stu.print_score()
print(stu.get_grade())

2-访问限制
  例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问

class Person(object):
    def __init__(self, name, score):
        self.__name = name
        self.__score =score
    def print_score(self):
        print('name:%s,score:%s'%(self.__name,self.__score))
    def get_name(self):
        return self.__name
    
person = Person('fengyong',88)
person.__name ='newName' #修改值
print(person.__name) #newName
print(person.get_name()) #fengyong 修改值没有生效

3-继承和多态

class Animal(object): #继承object
    def run(self):
        print('Animal is running')
        
class Dog(Animal): #继承Animal
    def run(self):
        print('Dog is running')
        
class Cat(Animal):
    def run(self):
        print('Cat is running')

        
def run(animail):
     animail.run()
     
animal = Animal()
run(animal)    
run(Dog())
run(Cat())
#对于Python这样的动态语言来说,则不一定需要传入Animal类型。
#我们只需要保证传入的对象有一个run()方法就可以了

 4-获取对象信息

  4.1使用type()函数

type(123)#<class 'int'>
type('str') #<class 'str'>
type(123)==type(456) #True
type('abc')==str #True
type('abc')==type(123) #False

import types 
def fn():
    pass
type(fn)==types.FunctionType#True
type(abs)==types.BuiltinFunctionType #True
type(lambda x: x)==types.LambdaType#True
type((x for x in range(10)))==types.GeneratorType #True
dir(types)  #可查看types常用常量

   4.2 isinstance使用

#使用 isinstance, 对于class继承来说,type()就很不方便
#如果继承关系是:object -> Animal -> Dog -> Husky
isinstance(d, Dog) and isinstance(d, Animal) #true
isinstance([1, 2, 3], (list, tuple)) #判断是某类型中的一种
isinstance(b'a', bytes) #True

  4.3 dir使用

#如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list
dir('ABC')

 4.4 len(obj)

  我们自己写的类,如果也想用len(myObj)的话,就自己写一个__len__()方法

4.5 getattr()、setattr()以及hasattr()

  仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:

class MyObject(object):
     def __init__(self):
         self.x = 9
     def power(self):
        return self.x * self.x
obj = MyObject()
hasattr(obj, 'x') # 有属性'x'吗? True
setattr(obj, 'y', 19) # 设置一个属性'y'  
getattr(obj, 'y') # 获取属性'y',如果不存在此属性会报异常
getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404,

   实例属性和类属性

class Student(object):
    name ='fengyong' #类的属性
    
stu = Student()
stu.name #fengyong
stu.name = 'new Name'
stu.name #new Name
del(stu.name) #删除绑定的属性
stu.name #fengyong 类属性的值

从上面的例子可以看出,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网