Python中的类的定义和对象的创建方法
涤生大数据 人气:0面向对象中两个重要的概念:
1.类 :对一类事物的描述,是抽象的、概念上的定义。比如做石膏像的模型
2.对象:实际存在的该类事物的每个个体,因而也称实例(instance)。比如石膏像
二者的关系:对象是由类派生的、创建的。一个类可以创建无穷多个对象,每个对象都属于类。
1.创建类和创建类对象
1.创建类,类主要由类名,属性,方法组成,当然创建一个类时,属性和方法可以选择的。 class Person: def cry(self): #类方法:跟函数的定义类似,但是self参数自带的,这也是类的方法和普通方法的区别。 print("I can cry") def speak(self): print("I can speak:%s"%(self.word)) ---------创建对象----------------------------------------------------------------------- tom =Person() #创建对象,直接类名(),不用像java中还要new,所以python更加简洁 tom.cry() #调用对象的方法 tom.word="hahah" tom.speak() tom.age =18 #给对象添加属性 ,属性不用在类定义时声明,但这种方法给对象赋值麻烦,每个对象都要赋值。 tom.age =19 #上面已经给tom添加过age属性,再次属于调用,重新赋值。 ----------执行结果------------------------------------------------------------------------- ''' I can cry I can speak:hahah ''' 2.给类初始化属性,在对象创建时就给对象设定了一些默认值。这样不用给每个对象都添加属性了,比如每个Person都是china,sex都是male. _init_(self)该类的方法有点类似java中类的构造器,可以给类的对象赋初始值。 ------------------------------------------------------------------------------------------ class Person1: def __init__(self): #_init_(self),主要给类初始化一些属性,对象创建时自动调用该方法执行 self.country ="china" self.sex = "male" def speak(self): print("I am from %s ,wuwuwuwuu"%self.country) -------------创建对象---------------------------------------------------------------------- jack = Person1() jack.speak() print(jack.country,jack.sex) tom=Person1() tom.speak() print(tom.country,tom.sex) --------------执行结果如下:---------------------------------------------------------------- ''' I am from china ,wuwuwuwuu china male I am from china ,wuwuwuwuu china male ''' 3.属性虽然初始化了,但是固定死的,而实际每个对象的属性就不同。 所以通过初始化时调用参数的形式,给每个对象赋不同的属性值 class Person2: def __init__(self,name,age): self.age =age #这种用法类似java中的this.age=age.self意思可以理解为当前对象 self.name = name #表示将当前对象传进来的参数name的值赋给当前对象的属性name self.country = "china" #还是可以给类的每个对象都赋一个默认值。 def speak(self): print("name=%s,age=%d"%(self.name,self.age)) -----------创建对象------------------------------------------------------------------------ p1 = Person2("allen",19) p2 = Person2("sherry",22) p3 = p2 #让p3=p2.对象的赋值 p1.speak() p2.speak() print("p1:",p1) #直接打印对象 ,打印的是对象在内存中地址。 print("p2:",p2) print("p3:",p3) #发现p3的地址跟p2的地址一样。 '''执行结果如下: name=allen,age=19 name=sherry,age=22 p1: <__main__.Person2 object at 0x000001CBA3508BE0> p2: <__main__.Person2 object at 0x000001CBA3508CF8> p3: <__main__.Person2 object at 0x000001CBA3508CF8> ''
总结:
__init__()
方法,在创建一个对象时默认被调用,类似Java中构造器。不需要手动调用__init__(self)
中,默认有1个参数名字为self,必须写。如果在创建对象时传递了2个实参,那么__init__(self)
中出了self作为第一个形参外还需要2个形参,例如__init__(self,age,name).第一个self不需要手动传参。
__init__(self)
中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去- python中一个类中只能有一个__init__方法,不支持该方法的重载(类似java中构造器的重载)
- 每一个对象 都有自己 独立的内存空间,保存各自不同的属性多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用 传递到方法内部
2.新式类与旧式(经典)类
object
是Python
为所有对象提供的 基类,提供有一些内置的属性和方法,可以使用dir
函数查看
- 新式类:以
object
为基类的类,推荐使用 - 经典类:不以
object
为基类的类,不推荐使用 - 在
Python 3.x
中定义类时,如果没有指定父类,会 默认使用object
作为该类的 基类 ——Python 3.x
中定义的类都是 新式类 - 在
Python 2.x
中定义类时,如果没有指定父类,则不会以object
作为 基类
新式类 和 经典类 在多继承时 —— 会影响到方法的搜索顺序
为了保证编写的代码能够同时在 Python 2.x
和 Python 3.x
运行!
今后在定义类时,如果没有父类,建议统一继承自 object
class 类名(object): pass #尽量不要用下面这种老是写法,虽然不会报错,但是不推荐 class 类名: pass
加载全部内容