09-类-继承-重写-属性和方法-运算符重载

AffettoIris 2023-2-23 2,818 2/23
class MyClass:
    i = 12345
    def f(self):
        return 'hello world'
 
x = MyClass()

print(x.i)
print(x.f())

init

# python的类的构造方法是__init__(),在类实例化时会自动调用。
class Tool:
    def __init__(self, x, y):
        self.a = x
        self.b = y

t = Tool(1, 2)
print(t.a) # 1
print(t.b) # 2

self

python类方法必须包含参数 self, 且为第一个参数,按照惯例叫 self,当然,随便叫,self代表类的实例,而非类。

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()
# <__main__.Test instance at 0x100771878>
# __main__.Test
# 可见self 代表的是类的实例,代表当前对象的地址,而 self.class 才是类。

继承

class SonClass(FaClass):
    ...

子类会继承父类的属性和方法。如果父类是定义在另一模块中那么可以这样写:

import a
class SonClass(a.FaClass):
    pass
s = SonClass(); s.f()

子类也可以覆写继承自父类的方法,直接def同名方法即可。

多继承

class SonClass(FaClass1, FaClass2, FaClass3)

需要注意的是父类存在重名方法,而python的搜索顺序是现在子类找,再顺序找FaClass1, FaClass2, FaClass3直到找到。

方法重写

class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')
 
class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')
 
c = Child() 
c.myMethod()         # 调用子类方法
# 非要用子类对象c调用父类原方法咋搞?:
super(Child,c).myMethod() # 调用父类方法

类的私有属性和方法

__开头即可,例如__name,__get()。只能在类的内部调用 ,不能在类的外部调用

类的特殊方法

__init__() : 构造函数,在生成对象时调用
__del__() : 析构函数,释放对象时使用
__repr__() : 打印,转换
__setitem__() : 按照索引赋值
__getitem__(): 按照索引获取值
__len__(): 获得长度
__cmp__(): 比较运算
__call__(): 函数调用
__add__(): 加运算
__sub__(): 减运算
__mul__(): 乘运算
__truediv__(): 除运算
__mod__(): 求余运算
__pow__(): 乘方

运算符重载

附:python里可以两个对象相+-*/等运算,需要书写__add__()等方法,例如:
class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b
 
   def __str__(self): # 水太深了,还是没搞懂为什么少了这个函数就报错<__main__.Vector object at 0x000001DC91C6CDD0>
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)
 
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
- THE END -

AffettoIris

10月16日16:02

最后修改:2023年10月16日
0

共有 0 条评论