在面向对象的方法中,可以根据某些事物或者情景创建类,并基于这些类来创建对象。编写类时,定义一大类对象都有通用行为,基于类创建的对象,每个对象都自动具备这个类的通用行为。
根据类来创建对象被称为实例化。
在Python中编写类的方式如下:
class Dog():
'''创建小狗的类'''
def __init__(self,name,age):
self.name = name
self.age = age
'''动作方法 蹲下'''
def sit(self):
print(self.name+'蹲下了'+self.age)
方法init()
init()是一个特殊的方法,每当根据类创建类的实例时,Python都会自动运行这个方法。在这个方法中开头和末尾各有两个下划线。这是一种约定。避免Python默认方法与普通方法发生名称冲突。
init()定义中我们传递了三个参数:self、name和age。这个初始化方法中self是必须的。而且还必须位于其他的形参前面。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用。让实例能够访问类中的属性和方法
在init()方法中定义的两个变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用。
init()没有并没有显式地包含return语句,但Python自动返回类对象的实例。
Python2.7创建类的方法
在Python2.7中创建类
class ClassName(Object):
...
根据类创建实例
my_dog = Dog('dog1',22)
my_dog.sit()
访问属性
可以根据实例访问实例的属性。在执行时,Python会先找到实例,再查找与这个实例相关联的属性name.
print(my_dog.name)
为属性指定默认值
类中的每个属性都必须有初始值,我们可以为类的属性指定默认值。
class Car():
def __init__(self, name, year, price):
self.name = name
self.year = year
self.price = price
self.owner = 'dos auto'
def get_car_name(self):
return self.name
def get_car_woner(self):
return self.owner
my_car = Car('benz', 11, 2000000)
print(my_car.get_car_name())
print(my_car.get_car_woner())
类的继承
在上面总结的类的定义的时候,我们声明类的时候是从空白开始的,如果我们要声明定义的类是继承某一个类可以在此指定要继承的父类
定义子类时,必须在括号内指定父类的名称
在创建子类的实例时,Python首先需要给父类的所有属性赋值。
创建子类时,父类必须包含在当前文件中,且位于子类前面。
子类中可以使用super()代表父类的引用。
class Car():
def __init__(self, name, year, price):
self.name = name
self.year = year
self.price = price
self.owner = 'dos auto'
def get_car_name(self):
return self.name
def get_car_woner(self):
return self.owner
'''子类,电动汽车'''
class ElectricCar(Car):
def __init__(self, name, year, price):
super().__init__(name, year, price)
my_tesla = ElectricCar('tesla', 2, 200000)
print(my_tesla.get_car_woner())
print(my_tesla.get_car_name())
隐含的超类——object
每一个python类都隐含了一个超类:object,这个类是一个非常简单的定义,这个类几乎不做任何事情。对象生命周期的基础是创建、初始化和销毁。所有类的超类object都有一个默认包含pass的init()方法的实现。
继承中的init 方法
子类可以不重写init方法,实例化子类时,会自动调用父类中已经定义的init
如果子类中定义了init,也就是说子类重写了init,则不会再去自动调用父类中已定义的init方法
最好显式调用超类的init方法
看几个栗子
class father1:
def say_something(self,args):
print(args)
class father2:
def say_something2(self,args):
print(args)
class son:
def __init__(self):
print(self)
s = son()
>>>
上面的程序中,在构造son的实例对象时会自动调用son的已定义的init方法
'''
继承中的__init__
'''
class father1:
def say_something(self,args):
print(args)
class father2:
def __init__(self):
print("father2 init")
def say_something2(self,args):
print(args)
class son(father2):
def __init__(self):
print(self)
s = son()
上面的方法中,父类定义了init方法,但是子类重写了父类的init方法,这样程序就不会再调用父类的init方法了。除非显式调用父类的init方法:
class son(father