python面向对象编程(复习)

访问限制

在python中以‘___’(例如:__age)开头的变量为私用成员。注意如果后面也是以双下划线的话(例如:__age__),表示特殊变量特殊变量,其有着特殊用途(__len__()其是在调用len(类对象) 的系统函数时调用的类函数),特殊变量是可以直接在类外访问的。

构造函数

形如一下:
__init__(self,):

继承与多态

python的继承机制与java大同小异。

静态语言 vs 动态语言
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:
class Timer(object):
def run(self):
print(‘Start…’)

这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。
小结
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。

获取对象信息

1.dir(),可以用来获取相关类的成员信息。

In [4]: class A():
   ...:     def __init__(self,):
   ...:         pass
   ...:     def name(self,):
   ...:         print("name")
   ...:

In [5]: a = A()

In [6]: dir(a)
Out[6]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'name']

2.isinstance(a,b)方法可以判断a对象是否是b(类名)类,或者是其的子类,返回bool值(亦可以使用type进行类民的获取,以及比较,但是推荐使用isinstance,其可以将指定类型及其子类“一网打尽”)

实例属性和类属性

这一点与java类似,实例对象必须在类实例化为类对象时才可以进行使用,举个例子:

class A():
	name="MA"

上面的对象就是类属性,是可以直接通过类名直接调用的(A.name)

class A():
	def __init__(self,):
		self.name="MA"

用self.声明变量,上面的就是实例属性,其必须在类对象创建成功后才可以进行使用,是不可以直接通过类名调用的。

__slots__ 限制可用于动态拓展的属性

例子:

class A:
	__slots__=('age','name')
B=  A()

当类外试图通过B.scoure = "XXX"来拓展类时系统将会报错,因为scoure不在__slots__指定的范围,__slots__通过使用tuple来指定可以使用的命名范围的方式限制其可以动态拓展的命名范围。

@property 与 @成员名.setter

在python的类的设计中如果需要限定类成员变量的修改限制可以使用* @property (以指定函数提供的方式读取类成员)
@成员名.setter(以指定的函数方式修改类的成员)

示例:

class Screen(object):
    def __init__(self,):
         self.__resolution=786432
         pass
    @property
    def width(self,):
        return self.__width
    @property
    def height(self,):
        return self.__height
    @property
    def resolution(self,):
        return self.__resolution
    @width.setter
    def width(self,value):
        self.__width = value
    @height.setter
    def height(self,value):
        self.__heigth = value
# 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
    print('测试通过!')
else:
    print('测试失败!')
结果:
resolution = 786432
测试通过!
python支持多重继承

效果与c++相同
使用示例:

class Animal(object):
    pass

# 大类:
class Mammal(Animal):
    pass

class Bird(Animal):
    pass

# 各种动物:
class Dog(Mammal):
    pass

class Bat(Mammal):
    pass

#多重继承的使用示例
class Dog(Mammal, Runnable):
    pass
定制类

1.__len__对应len()方法
2.__str__对应str()方法
3.__iter__对应for … in …

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration()
        return self.a # 返回下一个值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值