面对对象编程是最有效的软件编写方法之一,在面对对象编程中,编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。对象在python中可以说是无处不在,对象就是用代码模拟真实世界。对象=属性+方法,一个对象的特征称为“属性”,一个对象的行为称为“方法”。
类里面创建函数不一样的地方就是要加个self,python 中的类可以生成无数个对象,当一个对象的方法被调用的时候,对象就会将自身的引用作为第一个参数传给该方法。
>>> class BALL:
... def setname(self,name):
... self.name=name
... def kick(self):
... print('my name is %s, oh,who kick me?'%self.name)
...
>>> a=BALL()
>>> a.setname('tom')
>>> a.kick()
my name is tom, oh,who kick me?
int()是一个特殊的方法,每当根据类创建新对象的时候,python都会自动运行它,每个与类相关联的方法调用都会自动传递实参self,让实例能够访问类中的属性和方法。
>>> class Dog():
... def __init__(self,name,age):
... self.name=name
... self.age=age
... def sit(self):
... print(self.name.title()+' is now sitting')
... def grow(self):
... print(self.name.title()+' is '+ str(self.age) +' years old')
...
>>> a=Dog('Tom',6) ####传入参数name,age
>>> a.sit() ###直接调用传入的参数
Tom is now sitting
>>> a.grow()
Tom is 6 years old
>>> class Car:
... def __init__(self,make,model,year):
... self.make=make
... self.model=model
... self.year=year
... def get_descriptive(self):
... print(self.year+self.model+self.make)
...
>>> mycar=Car('China','ak','2018')
>>> mycar.get_descriptive()
2018akChina
class Car:
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year=year
self.odo=0
def get_descriptive(self):
print(self.year+ self.model+ self.make)
def odometr(self):
print("this car has "+ str(self.odo) + " miles on it")
>>> mycar=Car('China','ak','2020')
>>> mycar.odometr()
this car has 0 miles on it ###参数中默认为零,所以结果为零
>>> mycar= Car('china','ak','2010')
>>> mycar.odo=23 ### 直接修改,让python在实例中找到属性odo直接修改为23
>>> mycar.odometr()
this car has 23 miles on it
>>> class Car:
... def __init__(self,make,model,year):
... self.odo=0
... print(self.year+ self.model+ self.make)
... print("this car has "+ str(self.odo) + " miles on it")
... def updataodo(self,mileage): ####在里面重新一个对象,让输入的参数为原来默认的值
... self.odo=mileage
>>> mycar=Car('china','ak','2020')
>>> mycar.updataodo(56)
>>> mycar.odometr()
this car has 56 miles on it
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法,所有的类称为父类,而新类称为子类 简单的例子
>>> class Parent():
... def hello(self):
... print("调用父类的方法")
...
>>> class son(Parent):
... pass
...
>>> a=son()
>>> a.hello()
调用父类的方法
复杂的例子
>>>class electric(Car):
pass
>>>class moto(Car):
def __init__(self,shape):
self.shape=shape
def getshape():
print('moto is '+ self.shape)
>>> mycar=electric('china','ak','2010')
>>> mycar.get_descriptive()
2010akchina
>>> class moto(Car):
... def __init__(self):
... pass
...
>>> mycar=moto('china','ak','2010')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes 1 positional argument but 4 were given
在这个例子里面我们看到定义moto的时候报错了,因为里面重写了魔法方块_init_,新的_init_没有初始化父类的属性,需要super函数帮助python把父类子类关联起来,改写如下:
>>> class moto(Car):
... def __init__(self,make,model,year):
... super().__init__(make,model,year)
...
>>> my=moto('china','ak','2010')
>>> my.get_descriptive()
2010akchina
在子类中增加属性shape,对应了增加了getshape的方法
>>> class moto(Car):
... def __init__(self,make,model,year,shape):
... super().__init__(make,model,year)
... self.shape=shape
... def getshape(self):
... print('moto is '+ self.shape)
...
>>> a = moto('cn', 'x', '2020', 'sda')
>>> a.getshape()
moto is sda
我们上面编写的类保存在一个名为class.py的文件中,文件中可以加上注释信息,这种保存方式就是将文件储存在模块中,用的时候导入模块就好 from class import Car
同样可以在一个模块中储存多个类,可以直接导入整个模块,再加上句点表示法调用里面需要的类 import class class.Car class.moto