猪行天下之Python基础——8.1 类与对象(中)

简介: 内容简述: 1、面相对象的理解 2、类与对象 3、继承 4、组合 5、对象相关的内置函数

⑤ 类函数,成员函数与静态函数


「类函数」用于访问类属性,使用@classmethod装饰器来修饰,第一个参数是cls,类本身用于调用类属性但是不能访问实例属性。类方法可以通过类直接调用,或通过实例直接调用。但无论哪种调用方式,最左侧传入的参数一定是类本身!!!代码示例如下:


class A:
    @classmethod
    def fun_a(cls):
        print(type(cls), cls)
if __name__ == '__main__':
    A.fun_a()
    a = A()
    a.fun_a()


运行结果如下


<class 'type'> <class '__main__.A'>
<class 'type'> <class '__main__.A'>


「成员函数和类实例绑定」类实例化后才能调用,它的第一个参数表示实例本身,一般用self表示成员函数可以直接操作对象内部的数据。如果使用类直接调用成员函数需要显式地将实例作为参数传入。代码示例如下:


class B:
    def fun_b(self):
        print("Call fun_b()")
if __name__ == '__main__':
    b = B()
    b.fun_b()
    B.fun_b(b)  # 类调用成员函数需将实例传入


运行结果如下


Call fun_b()
Call fun_b()


静态函数」,在定义上面的fun_b函数的时候,智能提示里就有一个Make method  static的选项,对于这种不需要self参数的函数(无需实例参与)都可以定义成静态函数调用过程中无需将类实例化。使用@staticmethod装饰器声明,通过 类名.函数名实例.函数名进行调用,代码示例如下:


class C:
    @staticmethod
    def fun_c():
        print("Call fun_c()")
if __name__ == '__main__':
    C.fun_c()
    c = C()
    c.fun_c()


运行结果如下


Call fun_c()
Call fun_c()


⑥ 访问控制


所谓的访问控制,就是「类的属性和方法是公有还是私有」,如果属性和方法只能在类内部访问,而不能被实例访问的话,我们就称这个属性或方法为私有的

 

Python和其他编程语言不同,没有类似于public和private这样的访问权限修饰符,而是采用一种「名字改编技术」。默认公有,而私有的属性名和方法名会加上两下划线,比如下面的__skill,当然这只是伪私有,改成了_类名私有属性/方法名,比如下面调用people._Person__skill,是可以访问到私有成员的:


class People:
    sex = 1  # 类属性
    __skill = "敲代码"  # 私有类属性,只能类内部访问,外部无法访问
    def speak(self):
        print("我是一个人,技能是:%s" % self.__skill, end='\t')
people = People()
people.speak()
people.sex = -1
print("性别:" + ("男" if people.sex == 1 else "女"))
print("访问私有属性:%s" % people._People__skill)


运行结果如下


我是一个人,技能是:敲代码   性别:女
访问私有属性:敲代码


虽然可以这样访问到私有成员,但是不建议这样做!


另外还有一种「单下划线开头的变量名或方法名」,同样是私有成员,不过类和实例都能访问,也会被子类继承。如果你不想属性或方法被子类继承就还是用双下划线吧!还有一种「开头结尾都是双下划线的属性或函数」是类的特殊成员,有特殊用途,比如上面的__init__初始化方法;最后如果你「定义的变量和某个保留关键字冲突」的话,可以使用单下划线作为后缀,比如:in_ = 1。


⑦ 动态绑定


Python中可以「动态地为类或对象绑定属性或函数」。类动态绑定属性与函数,对该类的所有实例有效。代码示例如下:


class A:
    def __init__(self, id_):
        self.id_ = id_
# 定义一个用于动态绑定的函数
def set_name(self, name):
    print("调用了动态绑定的函数")
    self.name = name
if __name__ == '__main__':
    # 动态绑定一个属性
    A.kind = "人类"
    # 动态绑定一个函数
    A.set_name = set_name
    a = A(1)
    # 类访问动态绑定的属性
    print(A.kind)
    # 实例访问动态绑定的属性
    print(a.kind)
    # 类访问动态绑定的函数
    A.set_name(a,'123')
    # 实例访问动态绑定的函数
    a.set_name('321')


运行结果如下


人类
人类
调用了动态绑定的函数
调用了动态绑定的函数


实例动态绑定属性与函数,只对当前对象有效,对其他实例无效,需要用到一个MethodType类,代码示例如下:


from types import MethodType
class B:
    def __init__(self, id_):
        self.id_ = id_
# 定义一个用于动态绑定的函数
def set_name(self, name):
    print("调用了动态绑定的函数")
    self.name = name
if __name__ == '__main__':
    b_1 = B('1')
    # 动态为实例1绑定一个属性
    b_1.kind = "人类"
    # 动态为实例1绑定一个函数
    b_1.set_name = MethodType(set_name, b_1)
    # 实例1设置动态绑定的属性与函数
    print(b_1.kind)
    b_1.set_name('123')
    # 另一个类实例调用动态绑定的属性
    b_2 = B('2')
    print(b_2.kind)


运行结果如下


人类
Traceback (most recent call last):
调用了动态绑定的函数
  File "/Users/jay/Project/Python/Book/Chapter 9/9_7.py", line 30, in <module>
    print(b_2.kind)
AttributeError: 'B' object has no attribute 'kind'


相关文章
|
2月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
116 4
|
2月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
3月前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
386 3
|
3月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
122 0
|
7月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
347 15
|
7月前
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
254 5
|
7月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
196 11
|
10月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
489 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
8月前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
179 1
|
11月前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
248 2

推荐镜像

更多
下一篇
oss云网关配置