Python:9.面向对象编程

访问限制

# 访问限制

# 将类中的属性私有化
'''
1. 内部属性不被外界访问,可以把属性的名称前加上两个下划线__
2. 实例的变量名如果以__开头,就变成了一个私有变量,只有内部可以访问,外部不能访问

3. 允许外部获取私有属性的值:给类增加get_name和get_score这样的方法
4. 允许外部修改私有属性的值:给类增加set_name和set_score这样的方法
'''
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))

    # 外部代码,获取私有属性的值
    def get_name(self):
        return self.__name
    
    def get_score(self):
        return self.__score

    # 外部代码,修改私有属性的值
    def set_name(self, name):
        self.__name = name

    def set_score(self, score):
        self.__score = score

继承和多态

# 继承和多态
# 继承
'''
1. 定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class, Super class)
2. 子类获取父类的全部功能
3. 多态:子类可以覆盖父类的方法
'''

# 多态
'''
开闭原则
对扩展开放:允许新增父类的子类
对修改封闭:不需要修改依赖父类类型的函数
'''

获取对象信息

# 获取对象信息

# type()
# 基本类型,变量指向函数,类都可以用type()
print(type(1234))
print(type('asf'))
print(type(None))

# 比较type类型是否相同
print(type(1234) == type(2345))
print(type(1234) == int)

# 判断一个对象是否是函数
def fn():
    pass

print(type(fn) == types.FunctionType)
print(type(abs) == types.BuiltinFunctionType)
print(type(lambda x : x) == types.LambdaType)
print(type((x for x in range(10))) == types.GeneratorType)

# isinstance()
# 判断class的继承
# 能用type()判断的基本类型也可以用isinstance()判断
# 可以判断一个变量是否是某些类型中的一种
isinstance([1,2,3],(list,tuple))

# dir()
# 获取一个对象的所有属性和方法,返回一个list
print(dir('ABC'))

# 自己写的类,如果要实现len(myObjec)方法,就自己写一个__len__()方法
class MyDog(object):
    def __len__(self):
        return 100

dog = MyDog()
print(len(dog))

# lower()返回小写的字符串
print('ABC'.lower())

# gettattr(),setattr(),hasattr()
# 有某个属性吗
print(hasattr(dog,'x'))
# 设置一个属性 x
setattr(dog,'x',20)
# 获取属性 x
print(getattr(dog,'x'))
# 如果试图获取不存在的属性,会抛出错误。可以传入默认参数,如果属性不存在,就返回默认参数
print(getattr(dog, 'y', 404))

实例属性和类属性

千万不要对类属性和实例属性使用相同的名字,因为相同名字的实例属性将屏蔽掉类属性的名字。但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性

你可能感兴趣的:(Python:9.面向对象编程)