装饰一个类及内部方法

通过装饰器函数修改一个类属性

class MyClass:

    NAME = 'My CLASS HAHAHA'

    def __init__(self):

        pass

print(MyClass.__dict__['NAME'])

My CLASS HAHAHA

等价于:

def setname(name):

    def warpper(cls):   

        cls.NAME = name

        return cls

    return warpper

@setname('MY CLASS enen')  #

class MyClass:

    pass

print(MyClass.__dict__['NAME'])

MY CLASS enen

例2:

class MyClass:

    def foo(self):

        print('foo')

    def bar():

        print('bar')

a = MyClass()

a.bar()

报错如下:

  File "E:\python_project\class_test.py", line 12, in <module>

    a.bar()

TypeError: bar() takes 0 positional arguments but 1 was given

提示最少需要给予一个参数才可以

这么写的意思是,函数是普通函数,但是实例化之后是无法使用

这样是不符合规定的

改进:

使用装饰器,第一个装饰器使用类方法

@classmethod

class MyClass:

    xxx = 'hahaha'

    def foo(self):

        print('foo')

    def bar():

        print('bar')

    @classmethod

    def clsmtd(cls):

        print('{}.xxx = {}'.format(cls.__name__,cls.xxx))

a = MyClass()

a.foo()

MyClass.bar()

print(MyClass.__dict__)

foo

bar

{'xxx': 'hahaha', 'bar': <function MyClass.bar at 0x0000000000DD0488>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None, 'foo': <function MyClass.foo at 0x0000000000DD0400>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__module__': '__main__', 'clsmtd': <classmethod object at 0x0000000000DD70F0>}

a.clsmtd()

MyClass.xxx = hahaha

静态方法使用

staticmethod

class MyClass:

    def foo(slef):

        return('foo')

    def bar():

        return('bar')

    @staticmethod

    def staticmtd():

        return('static')

a = MyClass()

print(MyClass.staticmtd())

print(a.staticmtd())

static

static

是类的方法即是所有对象的方法

py中的静态方法,表示最一般的函数放在静态方法中,但是受其管辖

然后测试bar方法是否可用

    @staticmethod

    def bar():

        return('bar')

a = MyClass()

print(a.bar())

bar

类方法

class Person:

    def haha():

        print('haha')

Person.haha()

haha

由于没有跟self,没有完成实例的绑定,所以不能完成实例对象的绑定,所以不能用

Person().haha()

TypeError: haha() takes 0 positional arguments but 1 was given

Person().haha()

语法是对的,但是禁止这么调用

@classmethod

class Person:

    HEIGHT = 16

    @classmethod

    def class_method(cls):

        print('class = {0.__name__} ({0})'.format(cls))

        cls.HEIGHT = 17

Person.class_method()

print(Person.HEIGHT)

for i in Person.__dict__.items():

    print(i)

返回如下:

class = Person (<class '__main__.Person'>)

17

('class_method', <classmethod object at 0x0000000000DA1278>)

('__weakref__', <attribute '__weakref__' of 'Person' objects>)

('__doc__', None)

('HEIGHT', 17)

('__module__', '__main__')

('__dict__', <attribute '__dict__' of 'Person' objects>)

在类定义中,使用@classmethod装饰器修饰方法

至少有一个参数,而且第一个参数留给了cls,cls表示调用即类对象自身

cls表示标识符,可以是任意名称,但是为了易读性

类方法是可以直接调用,而实例的方法要求实例必须存在,但是类存在的时候实例可能不存在

只要类方法定义过了,类对象就产生了,那么找属性即可找到

调用方法总结

代码如下:

class Person:

    def no():

        print('no')

    def method(self):

        print('{} method'.format(self))

    @classmethod

    def class_method(cls):

        print('class = {0.__name__} ({0})'.format(cls))

        cls.HEIGHT = 170

    @staticmethod

    def static_method():

        print(Person.HETGHT)

方法调用

类的调用

print(Person.class_method())

class = Person (<class '__main__.Person'>)

print(Person.static_method())

不能调用

print(tom.method())

<__main__.Person object at 0x0000000000A97160> method

print(tom.class_method())

class = Person (<class '__main__.Person'>)

print(tom.static_method())

不可以,没有传递对象

除了普通方法都可以调用,但是普通方法都需要对象的实例作为第一参数

实例可以调用所有类中定义的方法,类和静态方法

访问控制

访问控制主要为了保护封装不被破坏,但是python对外是可见的

私有属性

属性名前加入两个下划线表示当前方法不被破坏

class Person:

    age = 3

    height = 170

    def __init__(self,name,age=18):

        self.name = name

        self.age = age

    def growup(self,incr=1):

        if 0 < incr < 150:

            self.__age + incr

tom = Person('tom')

tom.age = 200

class Person:

    age = 3

    height = 170

    def __init__(self,name,age=18):

        self.name = name

        self.age = age

    def growup(self,incr=1):

        if 0 < incr < 150:

            self.__age + incr

    def getage(self):

        return self.__age

print(Person('tom').getage)

<bound method Person.getage of <__main__.Person object at 0x0000000000827208>>

class Person:

    def __init__(self,name,age=18):

        self.name = name

        self.__age = age

    def growup(self,incr=1):

        if 0 < incr < 150:

            self.__age += incr

    # 获取内部属性

    def getage(self):

        return self.__age

tom = Person('tom')

tom.growup(10)

print(tom.getage())

28

修改tom._Person__age

print(tom.getage())

tom._Person__age = 200

print(tom.getage())

200

查看tom.__dict__

print(tom.__dict__)

{'_Person__age': 200, 'name': 'tom'}

得到的字典中,其实是新加了一个key,而并非被覆盖

所以py的外界是可以修改的隐藏方法的

新增加key:

tom._Person__ages = 200

print(tom.getage())

print(tom.__dict__)

{'name': 'tom', '_Person__age': 20, '_Person__ages': 200}

私有变量的本质

使用__变量名 时,会将其改名,转为_类名+前缀,所以原来名字访问不到了

知道了这个名称则可以直接修改

print(a.__dict__)

{'name': 'tom', '_Person__age': 19}

保护变量

在变量前加一个下划线,共同的约定,表示提醒你这个是一个内部私有的

而解释器认为私有的是私有变量


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

G2 2.0 更灵活、更强大、更完备的可视化引擎!

概述 G2作为一款技术产品&#xff0c;自诞生以来&#xff0c;服务于广大的Web工程师群体和一部分数据分析师。一直来&#xff0c;G2 因其易用的语法和扎实的可视化理论基础&#xff0c;广受使用者好评。G2 1.x 的可视化能力已经非常强大&#xff0c;使用者已经能够在掌握图形语…

C语言试题十六之写删除字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

《iVX 高仿美团APP制作移动端完整项目》07 会员页制作

会员页如下&#xff1a; 一、会员页标题制作 会员页的标题是顶部的提示字样&#xff0c;该字样咱们可以分析&#xff0c;可以使用两个文本组件&#xff0c;每个占据一行&#xff1a; 首先咱们创建一个页面命名为会员中心&#xff1a; 接着在会员中心下创建一个行&#xff…

【ArcGIS风暴】ArcGIS添加超链接的两种方法详解

文章目录 1. 在识别对话框中添加超链接2. 利用属性字段添加超链接在ArcGIS中,可以很方便的设置文档超链接和URL超链接,设置完成后,只需要点击某个图斑就可以跳到指定的地址。本文详细讲解ArcGIS中超链接的设置方法。 1. 在识别对话框中添加超链接 启动软件,加载甘肃省行政…

Android Studio目录结构分析

Android studio 目录结构1. .gradleGradle编译系统&#xff0c;版本由wrapper指定2. .ideaAndroid Studio IDE所需要的文件3. app3.1 app/buildapp模块编译输出的文件3.2 app/libs放置引用的类库文件3.3 app/src放置应用的主要文件目录3.4 app/.gitgnoregit使用的ignore文件3.5…

《iVX 高仿美团APP制作移动端完整项目》08 会员页 标题、会员卡 制作

一、分类制作 我们接着往下制作该页的下半部分内容&#xff1a; 由于对应最下部分的商家推荐重复&#xff0c;直接复制即可&#xff0c;在此不做过多的讲解&#xff1a; 接下来我们创建一行命名为内容&#xff0c;用以作为下半部分的容器&#xff1a; 接着我们制作第一个种…

C语言试题十七之用来求数组的最大元素在数组中的下标并存放在k所指的储存单元中

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

微软AI插件Github Copilot初体验

前言上个月看到了一款插件 微软 GitHub AI 编程工具 Copilot于是就想尝尝鲜&#xff0c;但是GitHub Copilot是需要申请的&#xff0c;只有申请通过的才能使用这款插件。就在今天我收到审核通过的邮件。于是想看看这插件是不是像其它网友说的那样强&#xff01;使用于是打开了我…

Firefox about

在firefox的地址栏输入about:about,然后看一下各个链接.有的链接有具体的用途,有的链接疯言疯语,并无软用. about:about集中了火狐浏览器的全部用户界面,平时常见的preferences,startpage,add-ons等都可以在此处见到. about:mozilla是mozilla之书,它仿照圣经的语言风格,讲述了m…

关于互斥锁,条件变量的内核源码解析

一、解决问题和适用范围 主要是用来等待一个条件&#xff0c;这个条件可能需要另一个线程来满足这个条件。这个和我们平常适用的pthread_mutex_lock的最大不同在于后者保护的一般是一个代码段(也就是关键区)&#xff0c;或者一个变量&#xff0c;但是由于一般来说这个变量的访问…

【CASS精品教程】CASS 9.2绘制地籍图详细实验案例教程

文章目录 4.1 绘制地籍图4.1.1 生成平面图4.1.2 生成权属信息数据文件4.1.3 绘权属地籍图4.1.4 图形编辑4.3 绘制宗地图4.3.1 单块宗地4.3.2 批量处理4.4 绘制地籍表格4.4.1 界址点成果表4.4.2 界址点坐标表4.4.3 以街坊为单位界址点坐标表4.4.4 以街道为单位宗地面积汇总表4.4…

jquery.cookie.js 使用小结

先引入jquery&#xff0c;再引入&#xff1a;jquery.cookie.js添加一个"会话cookie"$.cookie(the_cookie, the_value);这里没有指明 cookie有效时间&#xff0c;所创建的cookie有效期默认到用户关闭浏览器为止&#xff0c;所以被称为 “会话cookie&#xff08;sessio…

Android开发 人民币符号(¥)显示不一致的问题

不小心踩了个坑&#xff0c;发现这个人民币符号在不同机器上显示不一致&#xff0c;有的显示一横&#xff0c;有的显示两横。 百度查了一下&#xff0c;找到好很多解决办法&#xff0c;改字体&#xff0c;用图片等等。 最后发现原来用的是全角的“&#xffe5;”的原因&#xf…

《iVX 高仿美团APP制作移动端完整项目》09 订单页制作

订单页制作比较简单&#xff0c;界面如下&#xff1a; 一、标题 首先创建一个页面&#xff0c;命名为订单页&#xff0c;并且给予背景色为黄色&#xff1a; 随后创建一个行&#xff0c;命名为主要并给予对应的基础属性&#xff1a; 接着给予这个主要行对应的上下内边距使其…

AutoDesk CAD 2014安装VBA Enabler图文教程(附AutoCAD_2014_VBA_Win_64bit下载)

在利用CASS将dwg地形图转为ArcGIS支持的Shapefile格式数据时,为了提高转换效率,通常我们会写一些VBA代码来实现,但是VBA不提供与AutoCAD OEM 安装介质,需要单独下载VBA环境。 Visual Basic for Applications (VBA) 引擎不再提供与 AutoCAD OEM 安装介质。 请联系您的 Auto…

C语言试题十八之根据以下攻势计算s,计算结果作为函数值返回;n通过形参传入。S=1+1/(1+2)+1/(1+2+3)+…….+1/(1+2+3+4+……+n)

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数f…

开源项目 英雄联盟 之WPF

WPF 英雄联盟作者&#xff1a;Devncore 组织 来自 韩国&#xff0c;首尔原文链接&#xff1a;https://github.com/devncore/leagueoflegends感谢分享者晨晞gg[1]&#xff1b;框架使用.NET6&#xff1b;C# 10.0;Visual Studio 2022;您可以了解如何正确实施 WPF 项目。描述了如何…

1055 最长等差数列

1055 最长等差数列基准时间限制&#xff1a;2 秒 空间限制&#xff1a;262144 KB N个不同的正整数&#xff0c;找出由这些数组成的最长的等差数列。 例如&#xff1a;1 3 5 6 8 9 10 12 13 14等差子数列包括(仅包括两项的不列举&#xff09;1 3 51 5 9 133 6 9 123 8 135 9 136…

Android studio 的快捷键 MAC 和Win版本

功能描述keymap对应名字MacWin/Linux提示错误解决方案Show Intention Actionsoption enteralt enterAS配置界面Preferencescommand ,controlaltS工程项目配置界面Project Structurecommand ;Control&#xff0b;AltShiftS快速构成代码Code Generatecommand Nalt insert代…

java中try 与catch的使用

(2011-10-08 17:08:43) 转载▼标签&#xff1a; 杂谈 分类&#xff1a; Javatry{//代码区}catch(Exception e){//异常处理}代码区如果有错误&#xff0c;就会返回所写异常的处理。 首先要清楚&#xff0c;如果没有try的话&#xff0c;出现异常会导致程序崩溃。而try则可以保证…