python 之路8 面向对象2

一。 面向对象三大特性:
多态
多种类型 参数可以是python的任意一种类型

def func(arg)
print(arg)

obj = func(int)
obj = func(str)
obj = func(dict)
封装
继承

二。面向对象中 成员
字段
class Foo:
#字段(静态字段) 存放在类里面 静态字段减少内存使用,多个对象公用一份
CC = 123

def _init__(self):
#name字段 为普通字段 存放在对象里面
self.name = ‘wyx‘

class Provice:
country = ‘中国‘

def __init__(self,name):
self.name = name

#一般情况下:自己访问自己的字段
hn = Provice(‘河南‘)
hb = Provice(‘河北‘)

hn.name 只可以访问自己的name字段
hb.name 只可以访问自己的name字段

#规则:
普通字段只能对象去访问
静态字段用类访问(万不得以的时候可以使用可以用对象去访问)
PS:静态字段代码加载的时候,已经创建

方法
所有地方法属于类
1.普通方法:至少有一个self,对象执行
2.静态方法:任意参数, 类执行
3.类方法 :至少一个cls, 类执行

class Provice:
country = ‘中国‘

def __init__(self,name):
self.name = name

def show(self):
print(self.name)

#普通方法,由对象去调用执行(方法属于类)
obj = Provice(‘河南‘)
obj.show()

#静态方法,由类去调用执行(方法属于类),静态方法可以没有参数或者有多个参数
@staticmethod
def f1(arg):
print(arg)

Provice.f1(1111111)

#类方法:静态方法的特殊方式,类方法至少有一个参数cls,cls自动传值
@classmethod
def f2(cls):
#cls为类名, cls()为创建对象
print(cls)

Provice.f2() #会输出类名

属性 对象调用执行
不伦不类的东西
具有方法的写作形式,具有字段的访问形式

class Pager:
def __init__(self,all_account):
self.all_account = all_account

@property #设置成具有字段属性的类型
def all_pager(self):
a1,a2 = divmod(self.all_account,10)
if a2 == 0:
return a1
else:
return a1 + 1

p = Pager(101)
ret = p.all_pager
#属性可以不用括号来调用
print(ret)

@all_pager.setter #设置成可以传参数的属性
def all_pager(self,value):
a1,a2 = divmod(value,10)
if a2 == 0:
return a1
else:
return a1 + 1
p = Pager
p.all_pager = 1111

@all_pager.deleter #设置成可以删除的属性 (del all_pager)
def all_pager(self):
del Pager.all_pagerggg

p = Pager
del p.all_pager

class Pager:
def __init__(self,all_account):
self.all_account = all_account

def f1(self):
return 123
def f2(self,value):
print(value)

def f3(self):
pass

foo = property(f1,f2,f3)

p = Pager(101)
#print(p.foo)
p.foo = 456
print(p.foo)
del p.foo

三。成员修饰符
公有:
class Foo:
def __init__(self,name):
self.name = name

def f1(self):
print(self.name)

obj = Foo(‘wyx‘)
print(obj.name)
obj.f1() #在类的内部和外部均可以调用为公共的

私有:
如果想要从外部访问私有的: _Foo__cc

class Foo:
def __init__(self,name):
self.__name = name

__cc = ‘123‘

def f1(self):
print(Foo.__cc)

obj = Foo(‘123‘)
print(obj._Foo__cc)

只能类自己本身内部成员可以访问
class Foo:
def __init__(self,name):
self.__name = name

__cc = ‘123‘

def f1(self):
print(Foo.__cc)

obj = Foo(‘123‘)
obj.f1()

四。特殊成员

class Foo:
#构造方法
def __init__(self,name,age):
self.name = name
self.age = age

#析构方法
def __del__(self):
pass

def __call___(self):
print(‘hahaha 调用我呀‘)

def __str__(self):
return ‘%s - %d‘ % (self.name,self.age)

# obj = Foo()
# obj() #__call__方法 对象后面加括号

obj1 = Foo(‘alex‘,99)
obj2 = Foo(‘wyx‘,18)
ret = obj1
print(ret) #__str__ print 对象名字调用__str__方法

__dict__ #获取对象中封装的数据
ret = obj1.__dict__
print(ret)

def __getitem__(self, item):
print(item)

def __setitem__(self, key, value):
print(‘set key value‘)

def __delitem__(self, key):
print(‘del key‘)

obj = Foo()
#以jian
obj[‘k1‘] #使用中括号调用__getitem__
obj[‘k1‘] = 1 #__setitem__调用方法
del obj[‘k1‘] #__delitem__ 调用方法

class Foo:

def __getitem__(self, item): #item为slince 类型 里面包括 起始,终止,步长 如果为切片方式访问
print(item.start)
print(item.stop)
print(item.step)

def __setitem__(self, key, value): #其中key为slince类型 value为list类型
print(‘set key value‘)
print(key.start)
print(key.stop)
print(key.step)

def __delitem__(self, key): #其中key为slince类型
print(‘del key‘)
print(key.start)
print(key.stop)
print(key.step)

obj = Foo()
obj[1:4:2] #自动执行__getitem__ [1:4:2]为item
obj[1:4:2] = [11,23,43,4554,33] #其中[1,,4,2] 为key 后面的列表为value
del obj[1:4] #其中[1,4] 为key

class Foo: #__iter__ 可以被for循环
def __iter__(self):
yield 1
yield 2

obj = Foo()
for item in obj:
print(item)

五。对象对象其他
- isinstance
对象是不是由这个类创建的

- issubclass
一个类是不是另一个类的子类 issubclass(bar,foo) bar是不是foo的子类

class c1:
def f1(self):
print(‘c1.f1‘)
return 123

class c2(c1):
def f1(self):
ret = super(c2,self).f1()
print(‘c2.f2‘)
return ret

obj = c2()
obj.f1() #使用super方法,c2找到自己父类c1的f1方法和self.f1自己的方法,输出c1和c2的f1方法

- 应用:
自定义类型,对字典进行补充,有序字典
class Mydic(dict):
def __init__(self):
self.li = []
super(Mydic,self).__init__()

def __setitem__(self, key, value):
self.li.append(key)
super(Mydic,self).__setitem__(key,value)

def __str__(self):
tem_list = []
for key in self.li:
value = self.get(key)
tem_list.append(‘%s:%s‘ % (key,value,))
temp_str = ‘{‘ + ‘,‘.join(tem_list)+‘}‘
return temp_str

obj = Mydic()
obj[‘k1‘] = 123
obj[‘k2‘] = 456
print(obj)

六。异常处理

七。设计模式之单例模式,创建方法
类方法

class Foo:
instance = None

def __init__(self,name):
self.name = name

@classmethod
def get_instance(cls):
if cls.instance:
return cls.instance
else:
obj = cls(‘wyx‘)
cls.instance = obj
return obj
obj1 = Foo.get_instance()
print(obj1)
obj2 = Foo.get_instance()
print(obj2)

时间: 2025-01-15 17:07:28

python 之路8 面向对象2的相关文章

Python之路:面向对象及相关

其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 class Foo(object): 2     pass 3   4 obj = Foo() 5   6 isinstance(obj, Foo) 二.issubclass(sub, super) 检查sub类是否是 super 类的派生类 1 class Foo(object): 2     pass 3   4 class Bar(Foo): 5     pass 6   7 issubcl

Python之路,Day6 - 面向对象学习

面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式. 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式. 两种最重要的编程范式分别是面向过

Python之路——初识面向对象

类的声明 1 def functionName(args): 2 '函数文档字符串' 3 函数体 1 class Person: #定义一个人类 2 role = 'person' #人的角色属性都是人 3 def walk(self): #人都可以走路,也就是有一个走路方法,也叫动态属性 4 print("person is walking...") 类的作用 属性引用 实例化:类名加括号就是实例化,会自动触发__init__函数的运行, 可以用它来为每个实例定制自己的特征 1 cl

python之路--17. 面向对象 -成员

三十六.面向对象的成员 能写的所有成员 一.变量 1.实例变量    访问时      对象.变量 2.类变量         访问时     类名.变量 注意: 二.方法 1.实例方法 必须有一个参数(self) 调用时      对象.变量() 2.类方法 必须有一个参数(cls) 定义时在方法前加        @classmethod 调用时       类名.变量() 3.静态方法(属于类) 可以不用参数 定义时 在方法前加       @staticmethod 调用时       

Python之路【第五篇】:面向对象和相关

Python之路[第五篇]:面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 class Foo(object):     pass obj = Foo() isinstance(obj, Foo) 二.issubclass(sub, super) 检查sub类是否是 super 类的派生类 1 2 3 4 5 6 7 class F

Python之路,Day7 - 面向对象编程进阶

本节内容 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业开发一个支持多用户在线的FTP程序 面向对象高级语法部分 静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法什么是静态方法呢其实不难理解普通的方法可以在实例化后直接调用并且在方法里可以通过self.调用实例变量或类变量但静态方法是不可以访问实例变量或类变量的一个不能访问实例变量和类变量的方法其实相当于跟类本身已经没什么关系了它与类唯一的关联就是需要通过

Python之路第一课Day6--随堂笔记(面向对象编程进阶...未完待续 )

本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 一.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它

Python之路,Day8 - 面向对象编程进阶

本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #_*_coding:utf-8_*_ class A:     def __init__(self):

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.