Python——面向对象

定义类

class 类名:
	赋值语句
	赋值语句
	.....
	def语句定义函数
	def语句定义函数
	.....

例:

class testclass:
    data = 100

    def setpdata(self, value):
        self.data = value

    def showpdata(self):
        print("data:", self.data)


x = testclass()
x.setpdata(123)
x.showpdata()
print(x.data)

类对象
类对象支持两种操作:属性引用和实例化。

  • 属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name
  • 类对象创建后,类命名空间中所有的命名都是有效属性名。

类的方法

在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。

类有一个名为 __ init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:

def __init__(self,value):
    self.data = value

类有一个名为 __del __() 的特殊方法(析构方法),该方法在实例对象回收时会自动调用,像下面这样:

def __del__(self):
    del self.data

其他方法
观察以下例子:

class test:
    def add(a, b):
        return a + b

    def add2(self, a, b):
        return a + b

#通过类对象调用方法
print(test.add(2, 3)) #5
print(test.add2(2, 3, 4)) #7
#创建实例对象
x = test()
print(x.add2(2, 3)) #5
print(x.add(2, 3)) #报错

  • 通过类对象调用方法,只需要记住参数个数,add2()方法中2传给了self,但是self并没有使用,所以计算结果仍为7
  • 如果实例化对象,对象会和参数一同传递给方法,add()方法只有两个参数,所以报错

解释一下self

  • self代表类的实例,而非类
  • 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
  • 通过实例对象调用方法时,当前实例对象作为一个参数传递进去
  • self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
  • self 不是 python 关键字,但是默认第一个参数
  • 个人认为self也就是java中的this指针

继承

格式如下:

class 类名(父类名):
	赋值语句
	赋值语句
	.....
	def语句定义函数
	def语句定义函数
	.....

定义子类构造函数时注意添加:
	 #调用父类的构函
        父类.__init__(self,n,a,w)

Python同样有限的支持多继承形式。多继承的类定义形如下例:

class 类名(父类名,父类名,父类名,父类名.....):
	赋值语句
	赋值语句
	.....
	def语句定义函数
	def语句定义函数
	.....
  • 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。

方法重写

  • 子类重写你父类的方法
  • super() 函数是用于调用父类(超类)的一个方法。

类属性与方法

类的私有属性
两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.属性名。
类的私有方法
两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.方法名。

class Site:
    def __init__(self, name, url):
        self.name = name  # public
        self.__url = url  # private

    def who(self):
        print('name  : ', self.name)
        print('url : ', self.__url)

    def __foo(self):  # 私有方法
        print('这是私有方法')

    def foo(self):  # 公共方法
        print('这是公共方法')
        self.__foo()


x = Site('syc', 'www.syc.com')
x.who()  # 正常输出
x.foo()  # 正常输出
 x.__foo()  # 报错

Python3 中类的静态方法、普通方法、类方法

  • 静态方法: 用 @staticmethod 装饰的不带 self 参数的方法叫做静态方法,类的静态方法可以没有参数,可以直接使用类名调用。
  • 普通方法: 默认有个self参数,且只能被对象调用。
  • 类方法: 默认有个 cls 参数,可以被类和对象调用,需要加上 @classmethod 装饰器。
class Classroom:
    @staticmethod
    def fun():
        print("静态方法")

    @classmethod
    def fun1(cls):
        print("类方法")

    def fun2(self):
        print("普通方法")


if __name__ == '__main__':
    x = Classroom()
    Classroom.fun() #静态方法
    Classroom.fun() #静态方法
    x.fun2() #普通方法

类的专有方法:

  • __init __ : 构造函数,在生成对象时调用
  • __del __ : 析构函数,释放对象时使用
  • __repr __ : 打印,转换
  • __setitem __ : 按照索引赋值
  • __getitem __: 按照索引获取值
  • __len __: 获得长度
  • __cmp __: 比较运算
  • __call __: 函数调用
  • __add __: 加运算
  • __sub __: 减运算
  • __mul __: 乘运算
  • __truediv __: 除运算
  • __mod __: 求余运算
  • __pow __: 乘方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值