Skip to content

Further Abstract #10

@eziceice

Description

@eziceice

更加抽象的内容

  • Python也是OOP的编程语言,因此封装继承多态也是Python中的重要特性.

  • 多态. 事实上,唯一能够毁掉多态的就是使用函数进行显式的类型检查,比如type,isinstance以及issubclass函数等.如果可能的话,应该尽量避免使用这些毁掉多态的方式.真正重要的是如何让对象按照你所希望的方式工作,不管它是否是正确的类型.

  • 封装.每一个object都有自己的状态,使用者不需要关心这个object的各种attribute是怎样进行设定的.

  • 继承.更好的设计,减少代码量.

  • 类(class)是指一种类型,而object都是某一个类的instance.

__metaclass__ = type #确定使用新式类,旧式类和新式类之间是有区别的. 
                     #新式类的语法中需要放置该赋值语句,但不是必要的显示地包含这行语句.

class Person:
    name = ''
    def setName(self, name):
        self.name = name
    def getName(self):
        return self.name
    def greet(self):
        print("hello world " + self.name)
        
  • 方法(绑定方法)将它们第一个参数绑定到所属的实例上,因此不需要提供该参数(self).Python与Java不同的是可以将方法方法绑定到另一个方法上,这样原有的方法就会被改变了. Python中的方法绑定换了实际就是将参数中需要的self更换了.
class Test:
    def method(self):
        print('12345')

def method2():
    print('678910')

a = Test()
a.method() #12345
a.method = method2 #对方法进行绑定,可以理解为对方法进行赋值.
a.method() #678910
b = a.method
b() #678910
  • Python并不直接支持私有方式(类似于Java中的private),可以通过添加双下划线_来将方法或者特性变为私有. 不过通过object._Class名__私有方法或者attribute也是可以访问到私有的property的,但是不建议这样做.简而言之,Python中并不能确保私有的方法或者变量无法被外界访问(类似于Java反射也可以访问私有的变量或者方法),但是十分不建议developer这样做.
class Private:
    __name = '12345' #设为私有
    def __getName(self): #设为私有
        print(self.__name)

    def getName(self):
        self.__getName()

p = Private()
p.getName()
p.__name #无法访问,报变量不存在的exception
p.__getName() #无法访问,报方法不存在的exception
p._Private__getName() #可以访问,但是并不建议
  • 类的命名空间(class namespace),所有位于class语句中的代码都在特殊的命名空间中执行,这种特殊的命名空间被称为类命名空间.这个命名空间可由类内所有成员访问.
class C:
    print(1234)
C #1234

class MemberCount:
    members = 0 #该attribute为所有object共享
    def init(self): #该方法只为每个self object使用
        MemberCount.members += 1

a = MemberCount()
a.init()
print(a.members) #1

b = MemberCount()
b.init()
print(b.members) #2 - members为所有类型共享的属性

a.members = 'k2'
print(a.members) #k2 - 新members的值被写到了a的特性中
print(b.members) #2 - b的特性中的members并没有被改变,因为上一个过程中发生了类范围内的变量屏蔽.
#类似于如果给共享的全局变量赋值,该变量就变成了该instance的局部变量.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions