静态方法

实例方法、类方法和静态方法

耗尽温柔 提交于 2020-04-08 13:58:07
Python中常用的三种方法: 1. 实例方法 (常见函数) 2. 静态方法 (@staticmethod) 3. 类方法 (@classmethod) 实例方法 定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法); 调用:只能由实例对象调用。 类方法 定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它性来传递类的属和方法(不能传实例的属性和方法); 调用:实例对象和类对象都可以调用。 静态方法 定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用实例的任何属性和方法,使用类的属性和方法需要使用类对象引用; 调用:实例对象和类对象都可以调用。 一、区别    二、代码示例    #!/usr/bin/env python # -*- coding:utf-8 _*- __author__ = '池偏一' ''' @author:shz @license: Apache Licence @file: testargs.py @time: 2018/06/19 @site: @software: PyCharm ''' import sys reload(sys) sys.setdefaultencoding

python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法

好久不见. 提交于 2020-04-08 12:26:48
1. 类对象和实例对象   Python 中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间。类对象具有以下两种操作: 可以通过“类名()”的方式实例化一个对象。 可以通过“类名.类属性”的方式来访问一个类属性。   如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化、实例化,即实例化对象是类对象实例化之后的产物。 class Person:# 声明一个类对象 pass p1 = Person()#声明一个实例对象 print(Person)#输出结果:<class '__main__.Person'> print(p1)#<__main__.Person object at 0x0000015F7F94D0F0> 2 类变量与实例变量 2.1 概念上的区别   类变量是指是指该类的所有实例说共有的数据,实例变量是该类每一个实例所特有的数据。这么说的话可能还是很抽象,我们拿人类(Person类)来打比方,人类能移动(move=True),这是每一个人(张三、李四)都能做的,所以我们可以说人类能移动,张三能移动,李四也能移动,这里的移动(move)就是一个类变量。但每一个人都可能有不同的姓名(name)和年龄(age),张三可能20岁,李四可能30岁,但是我们不能说人类(Person)都是20岁或30岁

python学习日记(OOP——静态方法和类方法)

时光总嘲笑我的痴心妄想 提交于 2020-04-08 12:23:28
classmethod 类方法在Python中使用比较少,类方法传入的第一个参数为cls,是类本身。并且,类方法可以通过类直接调用,或通过实例直接调用。但无论哪种调用方式,最左侧传入的参数一定是类本身。 通常情况下,类方法使用@classmethod装饰器来声明 当这个方法的操作只涉及静态属性的时候 就应该使用@classmethod来装饰这个方法 class Goods(object): __discount = 0.8#自定义商品折扣 def __init__(self,name,price): self.name = name self.__price = price @property def price(self): return self.__price*Goods.__discount @classmethod def set_discount(cls,value): cls.__discount = value apple = Goods('apple',5) print(apple.price) Goods.set_discount(0.5) #类直接调用 # apple.set_discount(0.1) #实例直接调用 print(apple.price) staticmethod 静态方法是指类中无需实例参与即可调用的方法( 不需要self参数 )

php静态缓存简单制作

馋奶兔 提交于 2020-04-08 04:40:41
制作缓存的目的是为了让我们的页面运行更加快速,减少读取数据库内容的次数,给用户更好的体验,为此我们可以使自己的程序做一下缓存,并且设置一个缓存过期的时间,来保证与数据库的一致,当然并不是所有的程序都适合做缓存,这里简单介绍一下php静态缓存制作的方法: 1.首先我们要定好一个缓存文件存放的位置,即存放目录 (李昌辉) 例如我这里存放在cache目录下,将来所有的缓存文件都放到该目录下 2.在要做静态缓存的页面,我们定义一个变量来存放一个缓存文件的路径(相对于当前页面的路径) $filename = "./cache/test.html"; 3.定义一个变量来存储缓存过期时间 $cachetime = 5; 4.判断一下,缓存文件是否存在或者是否过期,如果缓存文件不存在就执行源代码生成缓存,或者时间过期了也应该重新缓存一下,如果上述条件不满足则调用缓存页面显示。 if(!file_exists($filename) || filemtime($filename)+$cachetime<time()) { //缓存页面代码 } else { include($filename);//如果存在,调用缓存文件 } 5.生成缓存,在页面输出内容之前,我们调用ob_start()方法打开内存缓冲区,将要输出的内容放到内存里面。 ob_start(); 6.在页面输出完之后

创建型模式之单例模式

梦想的初衷 提交于 2020-04-06 16:23:12
1 概述 单例模式 应该是最简单,同时又是最复杂的一种 创建型模式 。因为大家都知道这个模式:无非就是保证某个对象在系统中只存在 一个实例 。然而想要真正实现一个完美的 单例模式 ,却不简单。 2 单例模式 一般 单例模式 的实现,都需要包含两个步骤: 将类的构造函数私有化。 提供一个 public 的方法,以供外界获取唯一的实例。 下面将一一介绍 单例模式 的各种实现方式。 3 案例 3.1 注册表式 提供一个 注册表 类,来维护所有 单例 的实例 public class Test { public static void main(String[] args) { SampleClass singleton1 = Registry.getInstance(SampleClass.class); SampleClass singleton2 = Registry.getInstance(SampleClass.class); System.out.println("Registry singleton instance1: " + singleton1.hashCode()); System.out.println("Registry singleton instance2: " + singleton2.hashCode()); System.out.println("We

你必须会的 JDK 动态代理和 CGLIB 动态代理

邮差的信 提交于 2020-04-06 15:52:30
我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性。 通过从静态代理、JDK 动态代理、CGLIB 动态代理来进行本文的分析。 静态代理 静态代理就是在程序运行之前,代理类字节码 .class 就已编译好,通常一个静态代理类也只代理一个目标类,代理类和目标类都实现相同的接口。 接下来就先通过 demo 进行分析什么是静态代理,当前创建一个 Animal 接口,里面包含 call 函数。 package top.ytao.demo.proxy; /** * Created by YangTao */ public interface Animal { void call(); } 创建目标类 Cat,同时实现 Animal 接口,下面是 Cat 发出叫声的实现。 package top.ytao.demo.proxy; /** * Created by YangTao */ public class Cat implements Animal { @Override public void call() { System.out.println("喵喵喵 ~"); } } 由于 Cat 叫之前是因为肚子饿了,所以我们需要在目标对象方法 Cat#call 之前说明是饥饿

todolist项目

纵然是瞬间 提交于 2020-04-06 00:23:38
首先配置 静态文件和模板文件: STATICFILES_DIRS = ( # Put strings here, like "/home/html/static" or "C:/www/django/static". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. os.path.join(BASE_DIR, 'static'),) TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. os.path.join(BASE_DIR, 'templates'),) import osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))在settings.py里面 其次配置配置数据库

Java之关键字的使用

耗尽温柔 提交于 2020-04-05 22:03:52
java中有很多的关键字,他们的使用让Java语言变得更加灵活、易用,下面将介绍Java中最常用的几个关键字并说明其用法。 关键字:return 1.使用范围: 使用在方法体中 2.作用: ​ ① 结束方法 ​ ② 针对于返回值类型的方法,使用"return 数据"方法返回所要的数据。 3.注意点: return关键字后面不可以声明执行语句。 在异常处理中try-catch-finally的结构中,如果try或catch中的结构中写了return,但是finally中的结构仍会执行。 关键字:this 1. 可以调用的结构: 属性、方法;构造器 2. this调用属性、方法: this理解为:当前对象 或 当前正在创建的对象 2.1 在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是,通常情况下,我们都择省略"this."。特殊情况下,如果***方法的形参和类的属性同名时***,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。 2.2 在类的构造器中,我们可以使用"this.属性"或"this.方法"的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都择省略"this."。特殊情况下,如果***构造器的形参和类的属性同名***时,我们必须显式的使用"this.变量"的方式,表明此变量是属性

Java线程中的锁你掌握了吗?

≡放荡痞女 提交于 2020-04-05 15:46:09
一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据。 public class Foo { private int x = 100; ​ public int getX() { return x; } ​ public int fix(int y) { x = x - y; return x; } } public class MyRunnable implements Runnable { private Foo foo = new Foo(); ​ public static void main(String[] args) { MyRunnable r = new MyRunnable(); Thread ta = new Thread(r, "Thread-A"); Thread tb = new Thread(r, "Thread-B"); ta.start(); tb.start(); } ​ public void run() { for (int i = 0; i < 3; i++) { this.fix(30); try { Thread.sleep(1); } catch (InterruptedException e) { e

静态代码块、构造代码块、构造函数、普通代码块

故事扮演 提交于 2020-04-04 06:50:42
1、静态代码块 (1)格式 在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块: public class CodeBlock { static{ System.out.println("静态代码块"); } } (2)执行时机 静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。后面在比较的时候会通过具体实例来证明。 (3)静态代码块的作用 一般情况下,如果有些代码需要在项目启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,我们就可以都放入静态代码块中。 (4)静态代码块不能存在任何方法体中 这个应该很好理解,首先我们要明确静态代码块是在类加载的时候就要运行了。我们分情况讨论:   对于普通方法,由于普通方法是通过加载类,然后new出实例化对象,通过对象才能运行这个方法,而静态代码块只需要加载类之后就能运行了。   对于静态方法,在类加载的时候,静态方法也已经加载了,但是我们必须要通过类名或者对象名才能访问,也就是说相比于静态代码块,静态代码块是主动运行的,而静态方法是被动运行的。   不管是哪种方法,我们需要明确静态代码块的存在在类加载的时候就自动运行了,而放在不管是普通方法还是静态方法中,都是不能自动运行的。 (5