面向对象简介http: www cnblogs com alex3714 articles 5188179 html
http: www cnblogs
面向对象简介
http://www.cnblogs.com/alex3714/articles/5188179.html
http://www.cnblogs.com/alex3714/articles/5213184.html
- 面向对象 object oriented programing
- 类的特性
- 封装:
- 防止数据被随意修改
- 使外部程序不需要关注对象内部的构造,只需要通过此对象对外提供的接口进行直接访问即可
- 继承:
- 通过父类--》子类的方式以最小代码量的方式实现不同角色的共同点和不同点同时存在
- 多态:
- 一个接口,多种实现
- self.XXX是如何实现的
class Dog(object): def __init__(self, name): self.NAME = name def sayhi(self): print("hello,I am a dog.my name is ", self.NAME) d = Dog("A") # 相当于Dog(d, "A") d2 = Dog("B") d.sayhi() # 相当于d.sayhi(d) d2.sayhi()
4. 类--》实例化--》实例对象
- init 构造函数
- self.name = name # 属性, 成员变量, 字段
- def sayhi() # 方法, 动态属性
- 私有属性
- __private_attr_name = value # 只允许内部访问
self__heart = "XXX" # 私有属性
- 如何外部访问,但是不允许改--可通过定义一个方法来返回此值
-
def get_heart(self): # 对外部提供只读访问接口 rerurn self.__heart
-
- r1._Role(类名)__heart # 强制访问私有属性
- 公有属性
- 在类 里面直接定义的属性 即是公有属性
- Role.nationality = "US" # 更改类的公有属性
- 公有属性在未创建实例之前,就已经存在内存中
- 方法,也是公有的,独一份。当创建实例的时候,引用它
- 析构方法
- 使用这个,在删除变量名和内存关联关系的时候,能够完全删除,做好收尾工作
-
def __del__(self): print("del.....run..")
新式类和经典类写法
SchoolMember.__init__(self, name, age, sex) # 经典类写法
super(Teacher, self).__init__(name, age,sex) # 新式类写法 推荐
class Person(object): # new style
super... # 继承时不同
class Person: # classical style
.__init # 继承时候
- 在多继承的时候,
- python3中全是广度查询
- python2中,经典类--深度查找,新式类--广度查找
多态
- 封装可以隐藏实现细节,使得代码模块化;
- 继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。
- 而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
什么时候使用面向对象
- 如果多个函数需传入多个共同参数时
- 根据一个模板创建某些东西
- 例子:写打开连接 关闭连接 写一个类 每次调用
补充
- self就是调用当前方法的对象
- 封装
- 类中封装了:字段 方法
- 对象中封装了:普通字段的值
- 继承
- 多态 多种形态
- 字段
每一个字段都有一个共同的值,设置为静态字段(下图中的country)--箭头为 类对象指针
- 普通字段(保存在对象中)
- 静态字段(保存在类中)--公有属性
- 方法
- 普通方法(保存在类中,调用者为对象)
- 静态方法(保存在类中,调用者为类(无需创建对象),可以有任意个参数)----使用类名直接调用
- 静态方法 @staticmethod # 实际上跟类没什么关系
一般不用,应用场景:制作工具包
静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或者实例中的任何属性 - 类方法
类方法:只能访问类变量,不能访问实例变量
打印:333 is eating - 属性方法
属性方法:把一个方法变成一个静态属性,隐藏实现细节
class Dog(object):
def __init__(self, name):
self.name = name
self.__food = None
@property # 方法变为属性
def eat(self):
print("%s is eating %s" % (self.name, self.__food))
@eat.setter # 对属性进行赋值
def eat(self, food):
print("set to food:", food)
self.__food = food
@eat.deleter # 删除属性
def eat(self):
del self.__food
print("删除成功")
def talk(self):
print("%s is talking" % self.name)
d = Dog("ChenRongHua")
d.eat
d.eat = "baozi"
d.eat
del d.eat
d.eat # 继续去“方法变属性”那里去找
打印结果:
C:\Python35\python3.exe D:/20160914d1/day8/属性方法.py
ChenRongHua is eating None
Traceback (most recent call last):
set to food: baozi
File "D:/20160914d1/day8/属性方法.py", line 34, in <module>
ChenRongHua is eating baozi
d.eat # 继续去“方法变属性”那里去找
删除成功
File "D:/20160914d1/day8/属性方法.py", line 14, in eat
print("%s is eating %s" % (self.name, self.__food))
AttributeError: 'Dog' object has no attribute '_Dog__food'
Process finished with exit code 1
类的特殊成员方法
- __doc__ 表示类的描述信息
- module 表示当前操作的对象在那个模块
- class 表示当前操作的对象的类是什么
- call 对象后面加括号,触发执行。
- dict 查看类或对象中的所有成员
- str 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
类的起源
f对象是Foo类的一个实例,Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。
那么,创建类就可以有两种方式:
a). 普通方式
class Foo(object):
def func(self):
print('hello alex')
b). 特殊方式
def func(self):
print 'hello wupeiqi'
Foo = type('Foo',(object,), {'func': func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员
def func(self):
print("hello %s"%self.name)
def __init__(self,name,age):
self.name = name
self.age = age
Foo = type('Foo',(object,),{'func':func,'__init__':__init__})
f = Foo("jack",22)
f.func()
metaclass
其用来表示该类由 谁 来实例化创建,所以,我们可以为 metaclass 设置一个type类的派生类,从而查看 类 创建的过程。
__new__ 是用来创建实例的