转:python学习——类中为什么要定义__init__()方法

学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧。

1、不用init()方法定义类
定义一个矩形的类,目的是求周长和面积。

 1 class Rectangle():
 2     def getPeri(self,a,b):
 3         return (a + b)*2
 4     def getArea(self,a,b):
 5         return a*b
 6
 7 rect = Rectangle()
 8 print(rect.getPeri(3,4))
 9 print(rect.getArea(3,4))
10 print(rect.__dict__)

得到结果:

1 14
2 12
3 {}

从上例中可以看到,我们在类中并没有定义init()方法,但是也能够得到类似的要求,结果返回了矩形实例rect的周长及面积。
但是,我们通过print(rect.dict)来看这个实例的属性,竟然是空的,我定义了一个矩形,按理来说它的属性应该是它的长、宽。但是它竟然没有。这就是没有定义init()的原因了。
并且,在实例化对象的时候,rect = Rectangle()参数为空,没有指定a、b的值,只有在调用函数的时候才指定了。且类中定义的每个方法的参数都有a、b,这显然浪费感情,在类中直接指定方法就可以了。、

因此吧,需要在类中定义init()方法,方便创建实例的时候,需要给实例绑定上属性,也方便类中的方法(函数)的定义。

2、用init()方法定义类
上述同样的例子,采用init()方法定义类,如下:

 1 class Rectangle():
 2     def __init__(self,a,b):
 3         self.a = a
 4         self.b = b
 5     def getPeri(self):
 6         return (self.a + self.b)*2
 7     def getArea(self):
 8         return self.a * self.b
 9
10 rect = Rectangle(3,4)
11 print(rect.getPeri())
12 print(rect.getArea())
13 print(rect.__dict__)

得到结果:

1 14
2 12
3 {‘a‘: 3, ‘b‘: 4}

定义完init()后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。

上述两个程序的不同之处,还望像我一样的初学者细细体会。
---------------------
作者:geerniya
来源:CSDN
原文:https://blog.csdn.net/geerniya/article/details/77487941
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/ldyj/p/10526217.html

时间: 2024-08-26 13:34:51

转:python学习——类中为什么要定义__init__()方法的相关文章

类中为什么要定义__init__()方法

总结一下, 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合 学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. class Rectangle(): def getPeri(self,a,b): return (a + b)*2 def getArea(self,a,b): return a*b rect = Rectangle() prin

python 旧类中使用property特性的方法

在python中,我们可以拦截对象的所有特性访问.通过这种拦截的思路,我们可以在旧式类中实现property方法. __getattribute__(self, name) #当特性name被访问时自动调用(只能在新式类中使用) __getattr__(self, name) #当特性name被访问且对象没有相应的特性时被自动调用 __setattr__(self, name, value) #当试图给特性name赋值时会被自动调用 __delattr__(self, name) #当试图删除特

[python]学习Django中的python知识拾遗

1.使用正则表达式进行URL匹配 urlpatterns = patterns('', # ... (r'^time/plus/\d+/$', hours_ahead), # ... ) (1)使用r代表字符串是原始字符串,表示python不会对立面的反斜杠\转义符进行处理,使用正则表达式一般使用原始字符串. (2)使用\d+表示匹配1个或者多个数字,如果限定只能使用两个数字,则\d{1,2}. (3)如果要把正则表达式的某个数作为参数,则用小括号包起来,如(r'^time/plus/(\d{1

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

NSMutableDictionary 类中增加键值对方法分析

在iOS中可变字典增加一个键值对的方法有setObject: forKey: 和setValue : forKey: .为了方便我们把这两个方法简称为方法A和方法B. B这个方法中其中的value值是不能为nil,否则程序会出项崩溃.而A方法中的这个value可以为nil,但是当这个value位nil时,系统会自动调用removeObjectforKey:这个方法.这样就把这个键值对删除掉了.B方法中的key值可以是任意类型的,但是这个类型必须要实现NSCopying协议.而A方法中它的key值

C#判断一个类中有无"指定名称"的方法

C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 using System; using System.Reflection; namespace Hello {     class Program     {  

scala中隐式转换之隐式转换调用类中本不存在的方法

/** * Created by root * Description : 隐式转换调用类中本不存在的方法 */ class Person(name : String){ def getPersonName = println("name = " + name) } object Type2Type{ implicit def type2(a : ImplicitTest2) = new Person("xiaoming") } class ImplicitTest

Python学习—pyhton中的进程

1.进程定义 进程: 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据.进程控制块(pcb)三部分组成.(1)我们编写的程序用来描述进程要完成哪些功能以及如何完成:(2)数据则是程序在执行过程中所需要使用的资源:(3)进程控制块用来记录进程的所有信息.系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志. 2.创建进程 新创建的进程在内存独立开辟一块空间,不与其他进程共享空间.数据.同一个进程中,新创建的线程与此进程里其他线程共享空间.数据. 1.os.fork(

怎样得到一个类中的所定义的变量的变量名

如:在类中我定义了几个个变量String helloString ="";String goodBye =""; 现在我要获取“helloString”这个字符串: 查了很多资料,终于找到了Java的反射技术,下面用以小程序来说明: import java.lang.reflect.Field;//引入包 public class Test {     public static void main(String[] args) {         Ha obj =