当前位置: 代码迷 >> 综合 >> Python-开发之路-面向对象-进阶
  详细解决方案

Python-开发之路-面向对象-进阶

热度:140   发布时间:2023-09-19 14:07:14.0

今天来更详细的讲一讲面向对象的其他一些内容

类成员:

字段

- 普通字段 :也称为动态字段,保存在对象中,只有对应的对象可以调用。
- 静态字段 :保存在类中,类和对象都可以调用,静态字段在类代码加载时,随类一起创建。

方法

- 普通方法 :只有创建了对象后才可以调用,自动将调用该方法的对象赋值给self。
- 静态方法 :相对于普通方法,静态方法在定义时没有“self”参数,上一行加上了‘@staticmethod’装饰器,相当于放在类中的函数,可以由类来调用,。
- 类方法 :必须含有“cls”参数,是‘class’的缩写,该参数是自动传递的,自动将调用该方法的类复制给cls,使用类方法时需要在上一行加上‘@classmethod’装饰器

属性

- 属性 :让方法以字段的形势被类调用

两种字段创建方式:

#!/usr/bin/env python
# -- coding = 'utf-8' --
# Author Allen Lee
# Python Version 3.5.1
# OS Windows 7
class Province:#静态字段,保存在类中,所有对象都可以访问.类和对象都可以访问静态字段country = 'China'def __init__(self,name):#普通字段(动态字段),保存在对象中.self.name = name

三种方法的创建

class Province:#普通方法:只在使用对象时才会被调用def f2(self):print(self.name)#静态方法:在方法前加@staticmethod ,方法的括号中没有self,由类调用,就相当于一个函数,只是存放位置不同@staticmethoddef f1(arg1,args2):print(arg1,args2)#类方法:参数至少有一个cls,是class的缩写,这个cls的参数自动传递,就跟普通的self一样。由类调用@classmethoddef f3(cls):#cls是类名,加上()可以创建对象cls()print(123)

属性 有两种创建方式:

一、装饰器方式创建

class Province:#属性,让方法以字段的形势调用@propertydef f4(self,all_count):a1,a2 = divmod(all_count,10)if a2 == 0:return a1else:return a1+1#属性的删除装饰器@f4.deleterdef f4(self):pass#属性的设置装饰器@f4.setterdef f4(self):passp = Province(101)
ret = p.f4
p.f4 = 111
del p.f4

二、静态字段方式

#!/usr/bin/env python
# -- coding = 'utf-8' --
# Author Allen Lee
# Python Version 3.5.1
# OS Windows 7class Pager:def __init__(self,all_count):self.all_count = all_countdef f1(self):return 123def f2(self):passdef f3(self):passfoo = property(fget=f1,fset=f2,fdel=f3)p = Pager(101)
result = p.foo
print(result)
p.foo = 'meta'

成员修饰符

    私有:只能类自己本身成员内部可以访问,定义时需要在前面加‘__’两个下划线(如:‘__name’)公有:在任何地方都可以访问

相对类成员就分别衍生出了:

        私有字段、公有字段私有方法、公有方法
#!/usr/bin/env python
# -- coding = 'utf-8' --
# Author Allen Lee
# Python Version 3.5.1
# OS Windows 7class Foo:#公有静态字段,都可以调用aa = '321'#私有静态字段,只能通过对象来进行内部调用,不能使用类来进行外部调用__cc = '321'#构造方法def __init__(self,name):#公有普通字段self.name = name#私有普通字段__self.age = 18#私有方法def __f1(self):print(self.name)#公有方法def f4(self):self.__f1()@staticmethoddef f2():print(Foo.__cc)print(self.__name)#类的继承
class Bar(Foo):def f3(self):print(Foo.__cc)print(Foo.__cc,Foo.__name)
obj = Foo('1231')
#借用对象实现对私有字段的内部调用
obj.f1()
obj.f4()
#强制调用私有字段,在类名前加_
print(obj._Foo__cc)
Foo.f2
#
pjt = Bar('alex')
pjt.f3()

特殊成员

__doc__ :获取注释信息
__init__ :通过类创建对象时,自动触发执行
__call__ :对象后面加括号,触发执行
__dict__ :类或对象中的所有成员
__str__ :如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值__getitem__、__setitem__、__delitem__ :用于索引操作,如字典。以上分别表示获取、设置、删除数据__getslice__、__setslice__、__delslice__ : 该三个方法用于分片操作__iter__ :用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__ 
#!/usr/bin/env python
# -- coding = 'utf-8' --
# Author Allen Lee
# Python Version 3.5.1
# OS Windows 7class Foo:#构造方法:该类创建的对象,全局封装参数,相当于初始化类内部的全局变量def __init__(self,name,age):self.name = nameself.age = age#析构方法:在内存清理垃圾数据时,有则调用此方法删除垃圾数据,没有则python自行销毁def __del__(self):passdef __dict__(self):print('dict')def __call__(self, *args, **kwargs):print('call')def __str__(self):return "%s-%s" % (self.name,self.age)def __getitem__(self, item):print('getitem',type(item))return 123def __setitem__(self, key, value):print('setitem',type(key),type(value))def __delitem__(self, key):print('del item',type(key))obj = Foo('mate',520)
#在对象后面加(),会执行__call__方法
obj()
Foo()()
print(obj)
ret = str(obj)
print(ret)#获取对象中封装的字段,类自带
_dict__
ret = obj.__dict__
print(ret,Foo.__dict__)
reg = obj['meta']
print(reg)
obj['k1'] = 111
ret = obj.__dict__
print(ret)el obj['k1']
ret2 = obj[1:4:2]
obj[1:4] = [11,22,33,44,55]
del obj[1:4]