关于创建类和引用类属性以及实例化
- 类变量:类内类方法外,公用可继承
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello world' # 实例化类 x = MyClass() # 访问类的属性和方法 print("MyClass 类的属性 i 为:", x.i) print("MyClass 类的方法 f 输出为:", x.f())
构造方法
init
关于参数,实例:class Complex: def __init__(self, realpart, imagpart): self.r = realpart self.i = imagpart x = Complex(3.0, -4.5) print(x.r, x.i) # 输出结果:3.0 -4.5
self代表类的实例而非类。类的方法与普通的函数只有一个特别的区别,他们必须有一个额外的第一参数的名称,按照惯例他的名称是self。
self代表类的实例,代表当前对象的地址,而self.class则指向类,类似C++的this指针,但又不完全相同。
self的名字并不是唯一的,可以换成其他名称
类的方法
用def定义
def fun(var):
继承
class son(f1,f2,f3) pass
需要注意括号中父类的顺序,当父类之间存在命名相同的方法,而子类中没有执行,则会从左至右搜索父类是否包含。
基类名必须与派生类定义在一个作用域内,除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用。
下面也包含了如何覆盖父类的构造
#类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
多继承
实例:
#类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade)) #另一个类,多重继承之前的准备 class speaker(): topic = '' name = '' def __init__(self,n,t): self.name = n self.topic = t def speak(self): print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic)) ##多重继承 class sample(speaker,student): a ='' def __init__(self,n,a,w,g,t): student.__init__(self,n,a,w,g) speaker.__init__(self,n,t) test = sample("Tim",25,80,4,"Python") test.speak() #方法名同,默认调用的是在括号中排前地父类的方法
注意其中派生类构造方法的写法。
方法重写
class Parent: # 定义父类 def myMethod(self): print ('调用父类方法') class Child(Parent): # 定义子类 def myMethod(self): print ('调用子类方法') c = Child() # 子类实例 c.myMethod() # 子类调用重写方法 super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
注意与重载父类的构造函数方式不同。
类属性与方法
类的私有属性
_private_attrs:两个下划线开头,说明该属性为私有,不能再类的外部被直接使用或直接访问。在类内部的方法中使用时self._private_attrs.
类的方法
在类的内部,使用def关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数,self代表的是类的实例
类的私有方法
_private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用,不能再类的外部调用。self._private_method
类的专有方法
- init:构造函数,在生成对象时调用
- del:析构函数,释放对象时使用
- repr:打印,转化
- setitem:按照索引赋值
- getitem:按照索引获取值
- len:获取长度
- cmp:比较运算
- call:函数调用
- add:加运算
- sub:减运算
- mul:乘运算
- truediv:除运算
- mod:求余运算
- pow:乘方
- str:将对象可视化的体现出来,优先级最高,默认打印的对象的地址
运算符重载
实例:
class Vector: def __init__(self, a, b): self.a = a self.b = b def __str__(self): 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)
关于以上实例有可以精简的部分
class Vector: def __init__(self, a, b): self.a = a self.b = b #可以写作 #class Vector: # def __int__(self,a,b): # x:int # y:int
类中的静态方法,普通方法,类方法
静态方法用@staticmethod装饰的不太self参数的方法叫做静态方法,类的静态方法可以没有参数,可以直接使用类名调用。
普通方法默认有个self参数,且只能被对象调用
类方法默认有个cls参数,可以被类对象调用,需要加上@classmethod装饰
class Classname: @staticmethod def fun(): print('静态方法') @classmethod def a(cls): print('类方法') # 普通方法 def b(self): print('普通方法') Classname.fun() Classname.a() C = Classname() C.fun() C.a() C.b()
super函数的妙用?