Skip to content

Further Abstract #10

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的局部变量.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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