Python学习基础:面向对象(1)

Python中也有面向对象编程的思想,它和C++有很多相似却不同的地方.

[0]:首先Python中的私有变量是通过(两个下划线)来表示的.这代表你如果用来描述一个变量,那么你就不能访问__xxx。但是Python中比较特殊的一点是,你并不是真的不能访问这个私有变量了.因为python把这个变量解释为_calsstype__xxx。classtype代表类的类型.所以你强行要访问也是可以的。python并不会阻止你做不合规矩的事情,只是提供了一点点保障而已.

[1]:其次,Python中class实例的数据添加也是比较有意思,它的数据类型是不确定的,你完全可以在创建之后再用 name.dataname = xxx的形式再给这个实例添加一个属性.同时在class的定义的函数内部添加新的属性.

[2]:我们只有在init()函数中可以确保这个class一定有什么变量,但是不确保它全部属性.

由于python是一个动态语言,它很自由很方便,当然也带来一些问题,我们传入的任何一个数据类型都是不确定的,它的动态性体现在只要这个数据类型有指定的方法,那么不管它是不是我们要求的数据类型,都是可以的.这与C++有本质区别,C++确保传入的参数一定是该类或者子类.不确定的是该类的具体方法.

看一个例子:

class Animal(object):
    def __init__(self,myspeed):self.__speed = myspeed
    def setspeed(self,otherspeed):self.__speed = otherspeed

    def display(self):print(self.__speed)
class Cat(Animal):
    def setspeed1(self,otherspeed):Animal.setspeed(self,otherspeed)
    def setspeed2(self,otherspeed):self.__speed,self._x = otherspeed,0
    def display2(self):print(self.__speed)



cat = Cat('50')
cat.setspeed(66)
cat.setspeed2(66)
cat.display()
cat.display2()

我们最需要注意的一点是python会将私有变量解释成为另外的名字.所以对于从父类继承而来的私有变量,我们一定要警惕,它的名字是父类的名字(如果你没有把init函数也重载一遍的话),这是因为该变量是通过父类的init函数添加的,通过哪一个类调用的就是哪一个类的classtype.所以要修改这个变量也要用父类的函数,否则你只是创建了一个新的属性而已.

[3]:python可以定义只属于类的属性,如

class X
name = ‘1

这样每一个X的实例都可以访问name,但是注意,如果你通过实例来修改name,比如 x = X(),x.name = 2,只会为该实例增加一个name属性,不会改变类属性name.这是危险的,因为实例的属性屏蔽了类属性,如果删除实例属性,你又会用到类属性.所以千万不要把实例的属性和类属性设置为一样的名字.

class Animal(object): name = 1 class Cat(Animal): pass cat = Cat() cat.name = 3; Cat.name = 2 print(cat.name,Cat.name,Animal.name) cat = Cat() print(cat.name)

可以发现,子类从父类继承来的类属性会变成独立的.而修改实例的类属性只会给该实例添加属性.这与C++static是不一样的.

你可能感兴趣的:(Python学习基础:面向对象(1))