面向对象编程

Posted waynew

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象编程相关的知识,希望对你有一定的参考价值。

类和实例

访问限制

如果让内部属性不被外部访问,可以在属性名称前加__,python中,实例的变量如果以__开头,就变成了私有变量

class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score

    def print_score(self):
        print('%s: %s'%(self.__name, self.__score))

继承和多态

判断某个变量是否是某种类型

isinstance(a, Animal)#判断a是否是Animal类型

动态语言的鸭子类型决定了继承不像静态语言那样是必须的

获取对象信息

使用type(),判断对象类型,返回对应的Class类型

type(123)#<class 'int'>
type('str')#<class 'str'>
type(None)#<class(None) 'NoneType'>
type(abs)#<class 'builtin_function_or_method'>
type('a')==str#True

判断一个对象是否是函数,使用types模块中定义的常量

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

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

isinstance('str',str)#True
isinstance([1,2,3,4],(list,tuple))#True

使用dir()获取一个对象的所有属性和方法

dir('abc')
#['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

类似__xxx__的属性和方法在Python中是有特殊用途的,如__len__方法返回长度,python中的len()方法其实就调用了__len__

len('abc')#3
'abc'.__len__()#3

自己写的类,如果也想用len(),则要实现__len__()
仅仅获得属性和方法还是不够的,配合getattr(),setattr(),hasattr()可以直接操作一个对象的状态

class MyObject(object):
    def __init__(self):
        self.x = 9
    def power(self):
        return self.x*self.x
obj = MyObject()
getattr(obj,'power')
fn = getattr(obj,'power')
fn()#81
hasattr(obj,'x')#True
obj.x#9
setattr(obj,'y',19)#设置一个属性'y'

如果试图获取不存在的属性,则会抛出AttributeError,可以传入一个default值,当属性不存在,就返回默认值

getattr(obj,z‘404‘)

实例属性和类属性

类本身绑定的属性称为类属性

class Student(object):
    name = 'Student'
s = Student()
print(s.name)#Student
print(Student.name)#Student

为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加

class Student(object):
    count = 0
    def __init__(self, name):
        self.name = name
        Student.count += 1

以上是关于面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章

面向面试编程代码片段之GC

Scala的面向对象与函数编程

面向对象编程

面向过程编程与面向对象编程

Java面向对象

面向对象编程(OOP)