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