python3.x 类和对象

  python同样支持类和对象。在python3.x中没有了经典类,只有新式类,默认创建的就是新式类。具体的新式类与经典类的不同在python3.x中已经没有意义了。

  类的定义和实例化

  python定义简单类如下。

class Car(object):
    pass

c1=Car()

  我们定义了一个Car类,其中什么方法也没有实现。c1是我们实例化的类Car,成为对象。

  静态变量

  我们可以在类中定义静态变量,静态变量属于类,既可以使用类访问,也可以使用对象访问。

class Car(object):
    type='car'

c1=Car()
print(c1.type)
print(Car.type)

  运行结果是:

car
car

  动态变量

  动态变量属于类,在第一次创建类的时候传入类中。动态变量只属于对象,只能由对象访问。

class Car(object):
    type='car'

    def __init__(self, name, colour):
        self.name = name
        self.colour = colour
        print('我被创建了。')

c1=Car('Lamborghini','yellow')
print(c1.type)
print(Car.type)
print('name:%s,colour:%s'%(c1.name,c1.colour))

  运行结果是:

我被创建了。
car
car
name:Lamborghini,colour:yellow

  类被创建的时候就会访问__init__()方法,上面的类__init__方法中请求了两个参数,所以创建的时候就必须要传入两个传输,其中self的意思是对象本身,以本例来说,当创建Car的实例c1时,self就是c1。

  因为作用域的原因,传入的两个参数只能在__init__()中使用,如果想要在其它地方调用,就需要将值传给self。而这个参数就被称为动态参数。

  动态方法

  类的动态方法是自定义的方法,同时只有对象能够调用。

class Car(object):
    type='car'

    def __init__(self, name, colour):
        self.name = name
        self.colour = colour
        print('我被创建了。')
    def show(self):
        print("The car's name is %s and colour is %s." % (self.name, self.colour))
        
c1=Car('Lamborghini','yellow')
print(c1.type)
print(Car.type)
print('name:%s,colour:%s'%(c1.name,c1.colour))
c1.show()

  运行结果是:

我被创建了。
car
car
name:Lamborghini,colour:yellow
The car's name is Lamborghini and colour is yellow.

  show()就是类的动态方法。

  静态方法

  有动态方法必然会有静态方法。静态方法属于类,类和对象都可以进行调用。

class Car(object):
    @staticmethod
    def description():
        print('This is a very fast car.')

c1=Car()
c1.description()
Car.description()

  静态方法的写法就是在动态方法前加入装饰器,并且不传入self参数。

  类的属性

  在方法前面加入@property装饰器,这个方法就变成了类的属性,可以以调用属性的方式进行方法的调用。

class Car(object):
    def __init__(self, name, colour):
        self.name = name
        self.colour = colour
    @property
    def show(self):
        print("The car's name is %s and colour is %s." % (self.name, self.colour))

c1=Car('Lamborghini','yellow')
c1.show

  运行结果是:

The car's name is Lamborghini and colour is yellow.

  可见,运行的时候不需要添加括号。

  私有变量

  在变量前面加入两个下划线就将这个变量变为了私有变量,创建的对象没有变法访问私有变量,私有变量只能内部访问。那么私有变量怎么显示呢?

class Car(object):
    def __init__(self, name, colour):
        self.__name = name
        self.__colour = colour
    def show(self):
        print("The car's name is %s and colour is %s." % (self.__name, self.__colour))

c1=Car('Lamborghini','yellow')
c1.show()

  运行结果是:

The car's name is Lamborghini and colour is yellow.

  私有变量能在类内部定义方法进行读取。

  利用类的特性也可以访问私有字段。

lass Car(object):
    def __init__(self, name, colour):
        self.__name = name
        self.__colour = colour
    def show(self):
        print("The car's name is %s and colour is %s." % (self.__name, self.__colour))
    @property
    def name(self):
        return self.__name

c1=Car('Lamborghini','yellow')
c1.show()
print(c1.name)

  运行结果是:

The car's name is Lamborghini and colour is yellow.
Lamborghini

  通过设定和私有字段相似的名称的特性名称,从程序外部看来就好像是访问了私有字段一样,这种方法也是可以访问私有字段的。

  私有方法

  将方法前面加上两个下划线就会变成私有方法,外部就无法访问这个方法了。而如果要访问这个方法只能在类的内部才可以访问。

class Car(object):
    def __init__(self, name, colour):
        self.__name = name
        self.__colour = colour
    def __show(self):
        print("The car's name is %s and colour is %s." % (self.__name, self.__colour))
    def func(self):
        self.__show()

c1=Car('Lamborghini','yellow')
c1.func()

  运行结果是:

The car's name is Lamborghini and colour is yellow.

  私有方法也可以使用以下方法进行调用,但是并不建议这样使用。

class Car(object):
    def __init__(self, name, colour):
        self.__name = name
        self.__colour = colour
    def __show(self):
        print("The car's name is %s and colour is %s." % (self.__name, self.__colour))
    def func(self):
        self.__show()

c1=Car('Lamborghini','yellow')
c1._Car__show()

  运行结果是:

The car's name is Lamborghini and colour is yellow.

  私有变量更改

  如果我们必须更改私有变量呢?其实也是有办法的,可以使用以下的方法。

class Car(object):
    def __init__(self, name, colour):
        self.__name = name
        self.__colour = colour
    def show(self):
        print("The car's name is %s and colour is %s." % (self.__name, self.__colour))
    @property
    def func(self):
        return self.__name
    @func.setter
    def func(self,value):
        self.__name=value

c1=Car('Lamborghini','yellow')
c1.show()
c1.func='car'
c1.show()

  运行结果是:

The car's name is Lamborghini and colour is yellow.
The car's name is car and colour is yellow.

  这样就实现了私有变量的更改的操作

  析构函数

  __init__()在对象被创建的时候进行调用,成为构造函数。而对象被销毁的时候就会调用__del__()函数,成为析构函数。

class Car(object):
    def __init__(self):
        print('我被创建了')
    def __del__(self):
        print('我要被销毁了')

c1=Car()

  运行结果是:

我被创建了
我要被销毁了

  __call__方法

  python中也有一个方法叫做__call__(),这个方法是干什么用的呢?当对象作为一个函数进行执行的时候,就会执行这个方法。

class Car(object):
    def __call__(self, *args, **kwargs):
        print('call')

c1=Car()
c1()

  运行结果是:

call

  可以看到使用这个方法之后,对象就能添加括号直接进行执行了。

  

原文地址:https://www.cnblogs.com/cdinc/p/5860351.html