python面向对象(二)

一:对象类型判断

    python中判断一个对象的类型的方法:type()     isinstance()

import types
# type()
def func():
    pass
class Animal:
    pass
class Dog(Animal):
    pass
class Husky(Dog):
    pass
ha1 = Husky()
print(type(func) == types.FunctionType)
print(type(sum) == types.BuiltinFunctionType)  # <class 'builtin_function_or_method'>
print(type(sum) == types.BuiltinMethodType)
print(type(123) == int)
print(type('abc') == str)
print(type([1,3,5]) == list)
print(type(ha1) == Husky)

# isinstance()除了用来判断基本的类型,还可以判断继承关系中的类的类型
# 推荐优先使用 isinstance() 方法来判断某个对象的类型
print(isinstance(ha1,Husky))
print(isinstance(ha1,Dog))
print(isinstance(ha1,Animal))
print(isinstance(func,types.FunctionType))
print(isinstance(sum,types.BuiltinFunctionType))
print(isinstance(123,int))
print(isinstance('abc',str))
print(isinstance([1,3,5],list))
print(isinstance(123,(str,list,set,dict,int)))  # 可以元组的形式判断变量是否是某些类型中的一种

二:类的成员

    类的成员可以分为三大类:字段,方法 和 属性


class ClassMember:
    language = 'python'      # 静态字段 属于类
    def __init__(self,name,price,discount):
        self.name = name     # 普通字段 属于对象
        self.__price = price   # 普通字段中的私有字段 在面向对象(一)访问限制那有具体介绍
        self.__discount = discount

    def ord_func(self):     # 普通方法
        pass
    @classmethod      # 调用装饰器定义类方法;类方法是给类用的
    def class_func(cls):
        pass

    @staticmethod  # 调用装饰器定义静态方法;和传参数self的普通方法,传cls参数的类方法区分开来的方法
    def static_func():
        pass

    @property     # 调用装饰器property 定义属性;经典类只有这种装饰器,没有以下两种
    def price(self):
        return self.__price * self.__discount

    @price.setter   # obj1.price = value
    def price(self,value):
        self.__price = value

    @price.deleter
    def price(self):  # 为 obj1.price 设置 del方法
        del self.__price

    def double_price(self):
        return self.__price * 2
    double_price = property(double_price)   # 采用静态字段方式定义属性

obj1 = ClassMember('int',1000,0.7)
print(obj1.price)    # 700
obj1.price = 2000
print(obj1.price)    # 1400
print(obj1.double_price)  # 4000
del obj1.price
print(obj1.__dict__)  # {'name': 'int', '_ClassMember__discount': 0.7}

三:反射--通过字符串的形式操作对象的相关成员

# 查看一个对象所拥有的所有属性和方法 dir(object)  以列表的形式返回所有属性和方法
class Animal:
    name = 'animal'
    def run(self):
        pass
class Dog(Animal):
    pass
class Husky(Dog):
    pass
ha1 = Husky()
print(dir(ha1))
print(dir('abc'))

print(hasattr(ha1,'name'))  # 判断对象是否有某个属性
# print('name' in ha1.__dict__)
print(hasattr(ha1,'run'))  # 也可用于判断对象是否有某个方法

print(getattr(ha1,'name'))  # 获得对象的某个属性的值;若该属性不存在会报错
print(ha1.name)

setattr(ha1,'age','18')  # 设置对象的某个属性
# ha1.age = 18
print(getattr(ha1,'age',None))   # 第三个参数为默认值,若对象不存在某个属性则返回该默认值

delattr(ha1,'age')
print(getattr(ha1,'age',None))

四:类的内置方法

# __str__  控制打印对象时的输出内容与格式
# __call__  在对象被调用时触发执行;obj() 就是调用对象
class Foo:
    '''
    类的文档注释
    '''
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return 'name:%s  age:%s' %(self.name,self.age)
    def __call__(self, *args, **kwargs):
        print(self.name,self.age,args,kwargs)

rock = Foo('rock',18)   
print(rock)    # name:rock  age:18
print(rock.__doc__)   # 类的文档注释
rock(1,2,3,a=1,b=2,c=3)   #调用对象 rock 18 (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}
# __del__  在对象执行删除操作时触发执行;主要用于回收系统资源(析构函数)
class MyOpen:
    def __init__(self,filepath,mode='r',encoding='utf-8'):
        self.filepath = filepath
        self.mode = mode
        self.encoding = encoding
        self.open = open(filepath,mode=mode,encoding=encoding)
    def __del__(self):   # 对象f删除前将系统中打开的文件资源回收
        self.open.close()
f = MyOpen('a1.txt')
print(f.open.read())
class Foo(dict):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)

    # 当默认属性访问失败并出现AttributeError时调用
    # 此方法应该返回(计算)的属性值或引发AttributeError异常。
    def __getattr__(self, item):
        return self[item]

    # 在分配新属性时调用;key是属性名,value是属性值
    def __setattr__(self, key, value):
        self[key]=value
  
    # 在执行删除属性时调用;即执行del obj.name  时触发
    def __delattr__(self, item):
        print('SB')

f1 =  Foo(name='rock',age=18)

print(f1.name)    # rock
f1.hobby = 'coding'    # 此时会触发__setattr__的执行
print(f1.hobby)   # coding
del f1.name       # SB
print(f1.name)    # rock

猜你喜欢

转载自blog.csdn.net/hua1011161696/article/details/79961735
今日推荐