您的位置:首页 > 编程语言 > Python开发

2017.6.27 python学习 面向对象编程

2017-06-27 18:09 246 查看
面向对象编程,简称oop,对象作为程序的基本单元,一个对象包含了数据 和操作数据的函数

class Study(object):

def init(self,name,age):

self.name=name

self.age=age

1.类和实例

学习过java的同学能更容易的理解类和实例

类:是一类据用共同特点的事物的抽象描述,是创建实例的模板

实例:是一个具体的对象

2.访问限制

在class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑,但是也可以通过类名.属性的方法修改数据

在属性的名称前加上两个下划线__,将属性变成私有属性,之后就不能在通过实例名.变量名或者类名.变量名的方式范根或者修改数据

如果需要访问,可以在类中提供对应的set和get方法

你也许会发现通过实例名.变量的方法也可以修改变量的值,但是你这时候修改的并不是该变量的值,而是为该实例重新添加了一个变量,并为该变量赋值

双下划线开头的变量一定不能从外部访问吗?这个答案是否定的,我们可以通过’类名变量名’的方式访问,但是不建议你这样做,在不同的python解释器中,可能会把变量名改成不同的名称

3,继承和多态

在python中可以多继承,学过java的同学都知道java类的单继承

多态:一种事物多种形态,

方法覆盖:

如果子类和父类都存在名称相同,参数列表相同的方法,name子类方法可以覆盖父类方法

4.获取对象信息

type()–>获取对象的类型

isinstance()–>判断对象的类型

dir()–>获取对象的所有属性和方法

5.实例属性和类属性

为实例绑定属性可以通过self.属性名或者实例名.属性名的方法

直接在class中定义属性,这种属性为 类属性

6.限制实例属性

使用slots

在类级别定义

class Study(object):
__slots__('name','age')


这样,这个类对应的实例就只能绑定name和age两个属性,如果绑定两个之外的属性就抛出AttributeError异常

7.@property和@属性.setter

class Study(object):
@property# 相当于get方法
def name(self):
return self.name
@name.setter
def name(self,name)
self.name=name


8.定制类

定制类就是对一些方法的重写

打印一个对象,如果直接打印,我们得到的是地址值,如果想好看一点就要重写一下str方法

….



….

…..

9.元类

type可以返回一个对象的类型,也可以创建一个新的类型

def fn(self,name='hello'):
print(name)
Hello = type('Hello',(object),dict(hello=fn))


上面代码的意思是创建一个Hello类,继承object,方法hello为fn

metaclass:元类

控制类的行为–>先定义metaclass,就可以创建类,最后创建实例。

# 定义一个metaclass类,继承type
# metaclass是类的模板,所以必须从`type`类型派生:
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
class MyList(list, metaclass=ListMetaclass):
pass


本人对元类理解的不好,希望大神多多指教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python