Java工程师学快速Python(5) 面向对象

39 篇文章 1 订阅
7 篇文章 0 订阅

类对象

class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 实例化类
x = MyClass()
 
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

__init__() 方法:

相当于java中的构造函数

class MyClass:
    i=3
    j=4
    def __init__(self,i,j)://类初始化调用,self相当于java中的this关键字
        self.i=i
        self.j=j
    def __init__(self)://和java不同的是python不支持构造函数重载,默认下面这个会覆盖上面的构造函数
        pass

x=MyClass()
print(x.i,x.j)

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:

class MyClass:
    i=3
    j=4

    def __init__(self1,i,j):
        self1.i=i
        self1.j=j
        print(self1.__class__) //相当于java 中的class
        print(self1) //相当于地址


x=MyClass(1,3)
print(x.i,x.j)

继承

与java不同的是,python支持多继承,如果要跨模块就必须导入模块

class f1:
    def speak(self,s):
        print(s)
    def talk(self,s):
        print("f1"+s)

class f2:
    def speak(self,s,r):
        print(s,r)
    def talk(self,s):
        print("f2"+s)

class f3(f2,f1):
     pass




f4= f3()
f4.speak(3,3)
f4.talk("321")

python的多继承方式从左右到右,左边的方法会覆盖右边同名的方法,python中没有方法重载概念,但是有方法重写的概念

上面这段代码代码中,f2中的speak方法覆盖了f1中speak的方法,f2中的talk方法重写了f1中的talk方法,如果换成f3(f1,f2)

则f1中的方法会覆盖或者重写f2中的方法

强转

上面一段函数中如果要调用f2中的speak方法可以采用

super(f3,a).speak("23")

这就调用了f2中的speak方法

类的私有属性

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

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods

class JustCounter:
    __secretCount = 0  # 私有变量
    publicCount = 0    # 公开变量
 
    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print (self.__secretCount)
 
counter = JustCounter()
counter.count()
counter.count()
print (counter.publicCount)
print (counter.__secretCount)  # 报错,实例不能访问私有变量

类的专有方法:

  • __init__ : 构造函数,在生成对象时调用
  • __del__ : 析构函数,释放对象时使用  python 和java一样有自动回收的功能, del 对象,就会掉用这个方法 
  • __repr__ : 打印,转换   相当于java中的toString方法 注意这个方法有返回值
  • __setitem__ : 按照索引赋值   
  • __getitem__: 按照索引获取值
  • __len__: 获得长度         属性变量的个数
  • __cmp__: 比较运算       
  • __call__: 函数调用    
  • __add__: 加运算
  • __sub__: 减运算
  • __mul__: 乘运算
  • __truediv__: 除运算
  • __mod__: 求余运算
  • __pow__: 乘方

上面的方法中说一下__call__方法

在python中万物皆对象,函数可以调用,对象也可以进行吊椅哦那个

class Reader():
     def __init__(self,name,nationality):
            self.name = name
            self.nationality = nationality
     def __call__(self):
         print('Reader: %s    Nationality: %s' % (self.name, self.nationality))

r=Reader("213","!@3")
r()

上面的r对象通过Reader new出来,然后可以直接调用r()执行的就是Reader对象的__call__方法

装饰器:

这是python中最重要的一种语法糖

下面函数做了个蛋糕

def makecake():
    print("make cakes")

如果我要在做蛋糕后插下蜡烛

常规的做法是



def makecake():
    print("make cakes")
    print("插蜡烛")

但是这样做是会有问题,违反了开闭原则

java中有一种做法就是装饰器模式,python中同样有方法,叫装饰器

def makecake():
    print("make cakes")


def makecakeChalazhu(func):
    def wrap():
        func()
        print("chalazhu")
    return wrap


a=makecakeChalazhu(makecake)#记得不要带括号
a()

这是不是很像java的装饰器模式

python中还有更进一步的写法


def makecakeChalazhu(func):
    def wrap():
        func()
        print("chalazhu")
    return wrap

@makecakeChalazhu
def makecake():
    print("make cakes")

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值