python自定义函数func_python自定义函数与面向对象

前言

python的最大特点就是dynamically typed就是动态类型,不像java需要定义数据类型

引入

先从一段代码引入:

1

2

3

4

5

6

7

8

9

10class Dog():

def __init__(self,name,age):

self.name=name

self.age=age

def getName(self):

return self.name

dog=Dog('name',16)

print(dog.getName())

别急,我们先学习下py的函数,这个形式跟C以及java等语言有点不一样。跨度有点大,对于刚接触来说,我们需要对比一下。

自定义函数

先来看一个例子

1

2

3

4

5def my_func(message):

print('Got a messag: {}'.format(message))

my_func('hello world')

#这里其实我有个地方不是很懂,不过大约能够知道什么意思,就是{}用来占位,记得在java中log常常这么用

大致形式

1

2

3def 函数名(参数):

处理

return/yeild

与其他语言不一样的是,def是可执行语句,即函数被调用前,都是不存在的,直到被调用的时候才会创建一个新的函数对象,并赋予其名字

对于以上这段话不理解的我们需要对比以下代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14hello()

def hello():

print('hello')

return

#报错,在主程序里,函数要先于调用前的定义

def my_func():

hello()

return

def hello():

print('hello')

return

my_func()

#正常运行,因为def是可执行语句,在调用的时候都不存在,但是我们必须保证调用前都已经声明定义了

注:我们先有个全局的概念,然后我们在看一下细节

我们深入来看一个代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15def my_func(l):

if not isinstance(l,list):

print('what you input is not a list')

return

if len(l)==0:

print('waht you input is empty')

return

largest=l[0]

for item in l:

if item>largest:

largest=item

print('the largest item in l is {}'.format(largest))

return

my_func([8,-1,0,2])

多态

看到这个我真的哭了,这里的多态完全跟java不同

1

2

3

4

5

6

7def my_sum(a,b):

print(a+b)

return

my_sum(1,2)

my_sum([1,2],[3,4])

my_sum('hello','world')

#对于这种来什么就接受什么的函数,必要时需要在前面进行类型检查

函数变量的作用域1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27MAX_VALUE=100

def test1(value):

global MAX_VALUE

MAX_VALUE=value

print(MAX_VALUE)

return

def test2(value):

MAX_VALUE=value

print(MAX_VALUE)

return

def test3():

print(MAX_VALUE)

return

test3()

test2(1)

test3()

test1(1)

test3()

----

输出结果:

100

1

100

1

1

分析一下:

函数内部默认为局部变量,即当函数调用结束后(return),该变量会被收回,并且不能够被访问

Python的全局变量定义在主程序中

函数可以调用全局变量,如果用更改全局变量的时候需要 global关键字,这里并不是重新创建一个新的变量,而是告诉Python 解释器,这里的变量就是之前定义的全局变量

如果函数内部的变量名与主程序的变量名重名,那么局部变量将覆盖全局变量

现在我们基本上了解了python的函数基本规则,我们回到类

1

2

3

4

5

6

7

8

9

10class Dog():

def __init__(self,name,age):

self.name=name

self.age=age

def getName(self):

return self.name

dog=Dog('name',16)

print(dog.getName())

在这里我们对比java的dog类如何去定义

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17public class Dog{

private String name;

private int age;

Dog(String name,int age){

this.name=name;

this.age=age;

}

String getName(){

return this.name;

}

public static void main(String...ags){

Dog dog=new Dog("name",16);

System.out.println(dog.getName());

}

}

这两段代码执行的效果是一样的。

区别:

python不需要提前声明的类的属性,因为不要指明属性的数据类型

Python的构造函数不是以类名,虽然调用的时候是以类名,说明在声明定义该类的对象的时候,会自动调用Init函数

注意到python的每个函数里面都有一个变量self,但是在调用的时候又不需要传入该参数,你可以看到这个self的作用跟this的作用差不多,只不过在python中必须使用这个self,在每一个类的方法中,self总是指向当前的实例,在init函数中self指向的最新被创建的对象,在其他函数中,指向调用该方法的对象

1

2

3

4

5

6

7

8

9

10

11

12

13

14class Dog():

def __init__(self,name,age):

self.__name=name

self.age=age

self.__sex='boy'

def getName(self):

return self.__name

dog=Dog('name',16)

dog.__name='Name'

print(dog.__name)

print(dog.getName())

print(dog.__sex)

注:在一次被python的数据定义给坑了

首先我们注意到java里面数据是由private属性的,那么在python中默认以两个下划线表示该属性为私有属性,不可被对象之间调用

但是如果dog.__name记住这里的name属性不是该类的属性,而是你给dog这个变量重新定义的一个,与类里定义的不同

接着我们深入了解面向对象里面的细节,先来看一下下面这段代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28class Dog():

MAX_AGE=16

def __init__(self,name,age):

self.name=name

self.age=age

@classmethod

def newName(cls,name):

cls.name=name

return

def getName(self):

return self.name

@staticmethod

def get_MAX_AGE(age):

if age

print("the dog age is {}".format(age))

return

else:

print('the maxage is {}'.format(Dog.MAX_AGE))

return

dog=Dog('NAME',14)

print(dog.getName())

dog.newName('name')

print(dog.getName())

dog.get_MAX_AGE(16)

第一个MAX_AGE是类中定义的常量,可以通过self.MAX_AGE或者Entity.MAX_AGE调用

注意到 @classmethod和@staticmethod 我们已经将类中的函数区别开来了,首先是classmethod类函数,能够动态访问或者修改对象的属性,其第一个参数一般为cls,最常用的功能是实现不用的init构造函数(好吧,上述代码不具有参考意义) ,@staticmehod是静态函数,可以用来做一些简单独立的任务,像什么测试等等,最后就是成员函数,是最正常的函数,不需要任何声明,第一个self代表当前对象的引用

写到最后

这样,已经大致的会写python的类了,但是面向对象里面还有个重要的思想就是继承。不过这个留到后面来深入。当前我的目标就是对python基础有个全貌的了解。

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

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

相关文章

java的继承实例_java继承(实例讲解一)

Java继承(Java inheritance)Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周…

java 调用groovy_Java调用Groovy脚本

在idea下,标准的Java maven项目中展示如何调用Groovy脚本和方法。maven项目引进Groovy libFile -> Project Structure -> Global Libaries 添加下载好的Groovy下lib里面的jar包调用Groovy脚本首先,Java调用Groovy脚本需要该Groovy脚本里面有个main…

java struts 框架_java中struts 框架的实现

该文章主要简单粗暴的实现了struts的请求转发功能。 其他的功能后续会慢慢补上。最近在学习javassist的内容,看到一篇文章 大家一起写mvc 主要简单的描述了mvc的工作流程,同时实现了简单的struts2功能。这里仿照的写了个简单的struts2框架,…

memcached 使用 java_使用Java java_memcached client的陷阱

这2天,才发现之前我们的某个开发人员使用java_memcached-release_2.0.1.jar是有问题的在我们的某个模块里,需要2个memcached,分别提供不同的服务于是,开发的人员就从网上粘贴来如下的码,分别生成2个MemcacheUtil类stat…

java final 变量只读_java final的使用总结

final 变量:是只读的;final 方法:是不能继承或者重写的。final 引用:引用不能修改,但是对象本身的属性可以修改;final class:不可继承;final MyObject o new MyObject();o.setValue…

java list 获取索引_java – 获取arrayList中元素的索引

我试图在arrayList minuteList中获得466的索引[288, 318, 346, 376, 406, 436, 466, 1006, 1036, 1066, 1096, 1126, 1156]但我收到这个错误:java.lang.IndexOutOfBoundsException: Index: 466, Size: 13at java.util.ArrayList.rangeCheck(ArrayList.java:635)at j…

java 如何调用static_java 关键字static详细介绍及如何使用

java 关键字static 详解一、 static代表着什么在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码…

java xml setdoctype_如何在Java中使用DOM将自定义doctype标记添加到带有xhtml标记的xml中?...

我使用java中的DOM创建了一个XML文档,并将XHTML标记插入到XML文档中。现在我要添加如下doctype:]>我试着把它作为一个字符串追加,但没有成功。DocumentBuilderFactory docFactory DocumentBuilderFactory.newInstance();docFactory.setNamespaceAware(true);DocumentBuilde…

java 实验报告模板_java实验报告模板

java实验报告模板1 / 26java 实验报告模板河南工业大学实验报告课程 Java 程序设计 _ 实验名称 一、Java 程序流程控制 院 系____ ____ 专业班级__ _________ 姓 名_______________ 学 号____________ _ 指导老师: 日 期一.实验目的熟悉 Java 语言中的数据类型、变量…

Java写入磁盘阵列_磁盘阵列RAID介绍及计算公式

一、RAID介绍磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系…

dbm和mysql使用场景_mysql基本用法总结

1 下载安装官网下载:http://www.mysql.com/注意需要一个Oracle账号才能下载。2 启动mysql将mysql安装目录:设置为环境变量,并将:\bin目录加入环境变量中。启动命令行,输入:mysqld以启动mysql的守护进程。3 …

java disposable_rx-java – RxJava中的CompositeDisposable是什么

复合一次性使处理(认为提前取消更容易).假设您有一个活动同时发生多个api调用:var disposable api.call1(arg1,arg2).subscribe(...)var disposable2 api.call2(arg1).subscribe(...)var disposable3 api.call3().subscribe()如果您需要提前处置(例如,用户导航远…

Java中implies_boolean implies(Permission p)

boolean implies(Permission p)描述 (Description)java.util.PropertyPermission.implies(Permission p)方法检查此PropertyPermission是否隐含指定的Permission 。 这是通过检查p是PropertyPermission对象来完成的, p动作是该对象的动作的子集,并且该对…

java.rmi.server.port_java.rmi.server.ExportException: internal error: ObjID already in use报错处理...

由于在server.xml文件中使用配置了在catalina.sh中也指定了对应CATALINA_OPTS"$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port12340 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse -D…

java 易变变量_关于java:易变变量和其他变量

以下是经典Concurency in Practice的内容:When thread A writes to a volatile variable and subsequently thread Breads the same variable, the values of all variables that werevisible to A prior to writing to the volatile variable, become visibleto B …

java违反唯一约束异常_Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (DSPACE.SYS_C007868)...

Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (DSPACE.SYS_C007868).............................遇到这种问题解决方法1. 使用 约束条件查找包含的表明以及 表的字段select a.constraint_name,a.constraint_type,b.column_name,b.table_namefrom…

js中的if与Java中的if_JS直接if参数的用法JS中!和!!区别

经常在JS中见一些代码直接if(参数),然后参数调用的时候是将元素自己传下去。例如下面代码:functiontest1(obj){if(obj){alert($(obj).val());}else{alert("has not obj");}}我们分别点击上面的两个输入框显示如下:解释:实际上相当于java中的重载&#xff…

vs2019能写Java吗_Visual studio2019打包程序过程

要想打包visual studio中的程序我们需要用到setup用于自定义安装部署的项目方案。但是在VS2019中不见了,微软是有意废除安装项目的,合作了一个第三方的安装项目单独使用。我们可以从官网上把Visual Studio Installer 项目扩展下载下来。地址:…

java各个版本的特性_Java各个版本的新特性

原链接:http://blog.csdn.net/shareus/article/details/507361591.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)  http://www.jb51.net/article/78351.htm3.静态导入4.可变参数5.内省1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,…

java继承的终极奥义_java学习笔记12-继承

继承就是子类继承父类的特征和行为有时候单一划分某个类别并不能处理所有情况,某些类别下有明显不同的子类,这些子类虽然拥有类似的行为和属性,但是他们各自发生的这些行为的方式或者属性对某些结果的影响是不一样的,这就需要划分…