洗礼灵魂,修炼python(36)--面向对象编程(6)—类的相关内置函数issubclass,hasattr等

本文介绍了Python中用于类操作的一些内置函数,如issubclass、isinstance等,并详细解释了它们的功能及用法。

啥?我靠,类也有内置函数?哈哈,确实有的。有哪些呢?请往下看

issubclass(cls, class_or_tuple, /)

1.基本属性:

方法全是特殊方法

2.使用方法:判断一个类是否由另一个类派生(继承)

先说说里面的参数,第一个cls即是class,类的意思。第二个class_or_tuple是类或者元组(下同)

当第一个参数类是第二个参数类的子类,那么就返回True,属于非严格性道德检测:

  • 1)一个类被认为是其自身的子类
  • 2)class_or_tuple可以是类对象组成的元组,只要cls是元组的其中任何一个候选类,则返回True

3.例:

最后一个和object对象和定义的Human类做检测是返回真,这也说明前面提到的所有的参数都继承与object对象

 

isinstance(obj, class_or_tuple, /)

 1.基本属性:(略过,自行使用help和dir查看,下同)

2.使用方法:检测一个对象是否是给定类的实例对象

哈哈,这个BIF没想到吧?用法和type函数一样的,它居然也是类的BIF的,是的,其实比如字符串,整形这些类型它们也继承与str和int类,所以isinstance可以做出和type函数一样的判断。好的,用法都清楚,它就是用来检测实例对象是否属于类的。不过需要注意的是:

  • 1)如果第一个参数obj不是对象,则永远返回False
  • 2)如果第二个参数class_or_tuple不是类或者由类对象组成的元组,会抛出一个TypeError异常

3.由于用法都清楚了,所以不再举例。不过要注意的是这种情况:

看懂了吗?c是C类对象的实例化对象,C继承自A,但是不继承B,所以返回假,但是你说,C继承A,所以c和A为真,而B和c都是继承于object对象,你说那么c和B也为真啊。这种想法是错的,要注意了。(如果没有这种想法的直接略过,别搞混了)

 

super([type,obj | type2])

1.基本属性:(略过)

2.使用方法:在子类找出其父类以便于调用其属性

参数是可选的。前面在继承的博文中也提到了怎么使用了。要注意的是:

一般情况下仅能采用非绑定方式调用基类方法,而super()可用于传入实例或类型对象

比如:super(Human,self)(也就是前面解析super函数的第二种写法)

3.例:(略过,直接看前面的[继承]的博文就行)

hasattr(obj, name, /)

1.基本属性:(略过)

2.使用方法:测试对象里是否有指定的属性

第一个参数掠过,第二个参数“name”需要用引号(不然报错),字符串标志

 

3.例:

 

getattr(object, name[, default])

1.基本属性:(略过)

2.使用方法:获得给定类的属性的值

第一个参数不用说,第二个参数也是类的属性,需要引号,第三个参数可选,可以随意设定,当第二个参数并不是其类的属性时,返回设定的第三个参数

3.例:

 

 

setattr(obj, name, value, /)

1.基本属性:(略过)

2.使用方法:设置给定类的属性的值

第一个参数略过,第二个参数同样的是属性名,需要引号,第三个参数是要设置的属性的值

 

3.例:

 

delattr(obj, name, /)

1.基本属性:(略过)

2.使用方法:与seattr相反,删除给定类的属性(连值一起删除)

3.例:

报错信息是指A对象没有‘x’属性

 

property(fget=None, fset=None, fdel=None, doc=None)

1.基本属性:(略过)

2.使用方法:通过属性设置属性

第一个fget是获取属性的方法,第二个fget是设置属性的方法,第三个fdel是删除属性的方法,第四个doc是文档(很少用)

其实你可以理解就是通过property设定规则,当获取值,设定值,删除值都会直接作用与这个类对象把其事先设定的属性改变

3.例:

报错提示A类对象不存在属性‘x’。

 

property的用法后面还会出现。敬请期待

### Python 和对象以及面向对象编程基础 #### 什么是? 在 Python 中,是一种用于创建对象的蓝图或模板。通过定义一个,可以描述具有相同属性和行为的一组对象。的核心思想是将数据(属性)和功能(方法)组合在一起,从而实现代码的模块化和可重用性[^2]。 #### 如何定义? 可以通过 `class` 关键字来定义一个。下面是一个简单的例子: ```python class Animal: def __init__(self, name, species): self.name = name # 属性 self.species = species # 属性 def make_sound(self): # 方法 pass ``` 在这个例子中,`__init__()` 是一个特殊的方法,称为构造函数。当创建一个新的对象时,这个方法会被自动调用以初始化该对象的属性。 #### 创建对象 一旦定义了一个,就可以基于这个创建具体的对象。例如: ```python dog = Animal("Rex", "Canine") print(dog.name) # 输出: Rex print(dog.species) # 输出: Canine ``` 这里,`dog` 就是一个由 `Animal` 创建出来的具体对象。 #### 继承的概念 继承是指一种机制,其中新的可以从现有的派生出来。新会自动拥有旧的所有属性和方法,并且还可以添加额外的功能或者修改已有的功能。这有助于减少重复代码并提高代码的灵活性[^3]。 假设有一个更具体的动物别叫做 Dog,它可以这样被定义: ```python class Dog(Animal): def make_sound(self): return 'Woof!' rex = Dog("Rex", "Golden Retriever") print(rex.make_sound()) # 输出: Woof! ``` 在这里,`Dog` 是从 `Animal` 继承而来的,因此它不仅拥有了父所有的特性还具备了自己的独特之处。 #### 多态性和方法覆盖 多态意味着同名的不同事物可以根据上下文表现出不同的形式。在 OOP 的语境下通常指的是同一个接口能够适用于多种型的数据的能力。比如上面提到的 `make_sound` 函数就是一个很好的例子;尽管两个不同种的动物都有此方法,但是它们各自的表现却完全不同[^1]。 #### 使用内置函数检测关系 为了验证某个特定的是否为另一别的子集或者是某物的具体实例,我们可以利用 Python 提供的一些工具如 `issubclass()` 和 `isinstance()` 来完成这项工作[^4]: ```python print(issubclass(Dog, Animal)) # True print(isinstance(rex, Dog)) # True print(isinstance(rex, Animal)) # True ``` 以上展示了如何检查 `Dog` 是否为 `Animal` 的子,以及确认 `rex` 实例属于哪个--- #### 总结 Python面向对象编程提供了一种强大的方式去构建复杂的应用程序结构。通过合理运用、对象及其相关概念(像继承、封装、多态),可以让我们的软件开发过程变得更加高效有序。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值