与其他编程语言相比,Python在尽可能不增加新的语法和语义的情况下,增加了类机制。
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以重写基类中的任何方法,并且可以调用基类中同名的方法。
类中的方法实际上是类中的函数,可以分为实例方法、类方法和静态方法。方法和字段一样,都是类的属性,所以在操作时也有修改的特殊效果,但一般不建议这样做。
在类的基本语法中,我引入了构造函数方法:_ _ _ init _ _,_ _ _ new _ __;解构方法:_ _ _ del _ _;
请注意,虽然它以两个下划线(_ _)开头,但它同时以两个下划线(_ _)结尾,这表明它是一个“神奇的方法”。课堂上将对魔术方法进行讲解。
然而,如果你简单地从两个下划线开始,它仍然意味着私有化。请参见代码示例:
class test(object): def _ _ scolia _ _(self): #一个神奇的方法,它不是私有化的返回‘scolia’def _ _ good(self): #私有方法返回‘good’a=test()print a . _ _ scolia _ _()#神奇的方法可以访问print a.__good() #私有方法不能直接访问它。类似地,就像油田私有化一样,我们可以用特殊手段来实施。
打印a._Test__good() #强制访问
当然,私有方法也可以在类内部访问,就像私有字段一样。
因此,属性的私有化会混淆访问门户,同样,不建议强制访问私有属性。
可能这里的‘魔法法’好像不是‘魔法’,具体细节后面会解释。
-
示例方法:
在__init__构造函数中,提到它是一个实例方法,实例方法的特点是:
1.方法的第一个参数必须是self。当然,这是一种常规的写作方式。你可以用abc替换self,但是为了让其他程序员理解,统一使用self。在这里,self代表实例本身,也就是说,如果我在实例化时使用:a=Test(),那么self代表实例a,我们可以在很多构造函数中看到self.scolia='good '这样的写法。事实上,这种写法与类外的a.scolia='good '对于添加属性的效果相同,只是__init__方法是一个实例。
2.当实例方法被调用时,self被自动传递,所以我们不需要再次处理它。
3.只有在有实例的情况下才能调用实例方法,当然也有特殊的调用方法。
代码示例:
class test(object): def _ _ init _ _(self,a,b) : #构造函数在创建实例时初始化属性。自我。a=int (a) self。b=int(b)defaubc(self,C): #实例方法print self.a self.b int(c) #因为self是自动传递的,我们可以调用实例的属性a=Test(123,321) #我们只需要为a和b传递参数a.abc(666) #同样,只要C在这里传递参数,就会引入一个绑定(。
首先,我们知道方法是类的属性,而不是实例的属性。在上一篇博文中,我们还在类的属性和实例的属性中讨论了这个问题。
其次,一个方法只有在它的类有实例的情况下才能被调用。当一个类的实例存在时,一个方法被认为绑定到这个实例。当没有实例时,方法是未绑定的。
最后,任何方法定义的第一个参数是变量self,它表示调用此方法的实例对象。
显然,这里的绑定是例如方法。因为如果没有实例,self就不能传递,会导致参数不足,所以不能调用。
然而,我们可以通过自己传递来调用未绑定的方法。调用未绑定的方法通常意味着在我们继承父类之后,我们会覆盖父类中的一个方法,但是为了实现代码重用,我们希望在子类中调用父类的方法。简单地复制父类中的代码显然不是一个好的选择。除了浪费系统资源之外,还可能存在复制错误,将来修改父类的代码后,修改对应子类的代码效率太低。这是调用未绑定方法的场景。
代码示例:
类ABC(对象):def _ _ init _ _(自身,a) :self。a=-int (a)类测试(ABC) :def _ _ init _ _ (self,a,b) :abc。_ _ init _ _ (self,a)并手动传递selfself。b=b deffang fa(self): print self。一个自我。b #属性a由父类的构造函数创建,b由子类a=Test(123,321)的构造函数创建#我们只创建了子类的一个实例。如果不创建父类的实例a.fangfa(),我们就不能在不创建父类实例的情况下调用父类的实例方法,但是我们可以通过手动传递实例方法所需的self参数来实现调用。
这里的顺序是我们创建了一个Test的实例,它的自身是自动传递的。因此,在Test的构造方法__init__(self,A,b)中,self代表实例A,我们称之为abc。父类的__init__(self,A),其中self是子类的实例A,参数A是我们传递的123,而在父类中,self。最后,我们可以在子类的方法中调用属性self.a。
class Animal : def _ _ init _ _(self,name,life_value,aggr): self . name=name self . life_value=life _ value self . aggr=aggr def eat(self): self . life _ value=10 class Person(Animal): def _ _ init _ _(self,money,name,life _ value,aggr): super()。__init__(名称,life_value,aggr) self.money=money def攻击(self,obj): obj . life _ value-=self . aggr
从abc导入abcdmeta,abcdmethod类Payment(metaclass=abcdmethod): @ abcdmethod def pay(self,Money) : pass类微信pay (payment) : defpay (self,money) : #子类必须定义接口类中的方法,否则实例化会报错。pass w1=微信公众号()
property property decorator:类中的方法的调用方式与属性相同,这个decorator也有与之匹配的setter和deleter。
class Demo : @ property def P(self): print(' property func ')@ P . setter def P(self,Num): print(' property _ setter ')@ P . deleteref P(self): print(' deleting ')D=Demo()D . P . D . P=10 del . D . P-。
Staticmethod静态方法装饰器:将类中的方法更改为普通函数,或将类外的函数作为方法调用放入类中
Class a: @ static方法defsum () : #这个方法和普通函数没什么区别。用类名-print(' static method ')a . sum()#调用。无法操作对象属性class a : role=' maly ' @ class method defsum(cls): #来操作类属性print(cls.role)A.sum() #调用类型为类名-。
A:类pass class B(A): pass B=B()print(is instance(B,B))print(isinstance(b,A)) print (type (b)是b) print (type (b)是A-。
Getattr(对象或类名,‘属性或方法名’)获取对象或类的指定属性值或方法的内存地址
Setattr(对象或类名、“新属性名”、新属性值)向对象或类添加新属性或方法
Delattr(对象或类名,“新属性名”)删除以前添加的属性
__module__:指示当前操作的对象在哪个模块中。
_ _ class _ _ _:表示当前操作的对象的类是什么
__dict__:查看类或对象调用中的所有成员类,以打印类的所有属性,不包括实例属性。实例调用打印所有实例属性
__str__打印格式%s输出此方法的值
__repr__ print format %r输出此方法的值,当没有__str__方法时,%s输出此方法的值。__del__ del执行此方法。__getitem__采用对象加[]的值
class a : def _ _ init _ _(self)3360 self。name=[' egon ',' Alex ',' EVA'] #可以是其他序列def _ _ getitem _ _ (self,item) :print (self。名称[项目])
A=A(A)[1]-亚历克斯
_ _ setitem _ _ add value _ _ delivery _ _ delete value _ _ new _ _用于创建没有属性的对象。您可以调用对象的__new__而无需自己实现它。这个方法可以用来实现带有括号的singleton pattern __call__ object来执行这个方法__len__ len()来执行这个方法_ _ eq _==来计算和输出这个方法的值
__hash__ hash执行此方法
两个代码实现(三维向量类)
类别Vecter3: def __init__(self,x=0,y=0,z=0): self。X=x自我。Y=y自我。Z=z def __add__(self,n): r=Vecter 3(). r . X=self。X n.X r.Y=自我。Y n . Y r . Z=自我。Z n.Z return r def __sub__(self,n): r=Vecter3() r.X=self。X-n . X . r . Y=自我。Y-n . Y . r . Z=自我。Z - n.Z返回r def __mul__(self,n): r=Vecter3() r.X=self。X * n r.Y=自我。Y * n r.Z=自我。Z * n return r def __truediv__(self,n): r=Vecter 3(). r . X=self。X/n r.Y=自我。Y/n r.Z=自我。Z/n返回r def __floordiv__(self,n): r=Vecter 3(). r . X=self。X //n r.Y=自我。Y //n r.Z=自我。Z //n返回r def show(self): print((self。x,自我。是的,赛尔夫。z))v1=vector 3(1,2,3)v2=vector 3(4,5,6)v3=v1v2 v3 . show()v4=v1-v2 v4 . show()V5=v1 * 3 V5 . show()V6=v1/2 V6 . show()。
跑步后是
三种代码实现(程序类)
这个程序是用正则表达式匹配类编写的,可以删除重复的英文并输出。输入这是我的名字
导入重分类Good: def __init__(self,n): self . n=n def love(self): S1=re . split(r ' ',self.n) s2=sorted(set(s1),Key=s1.index) print (s2) b=good('这是我的名字')#您可以在这里输入字符串b.love()。
接下来,让我们看看运行结果
摘要
以上是边肖介绍的Python面向对象总结和类、正则表达式的详细讲解,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!如果你觉得这篇文章对你有帮助,请转载,请注明出处,谢谢!