Python语言的面向对象特性
刚开始用博客不久,不会排版,将就放着先
学习多篇文章进行了自己的理解和注释,附原文链接
1:https://blog.csdn.net/CLHugh/article/details/75000104(self用法介绍)
2:https://www.cnblogs.com/xuyaowen/p/OO.html(不同编程语言面向对象异同分析)
3:super继承:https://www.cnblogs.com/xiamaojjie/p/11977151.html
类与实例
定义一个类
class Student(object): #class Student 继承自object`在这里插入代码片`
🕐 pass
🕑 def __init__(self, name, score):
self.name = name #属性变量
self.score = score
🕑 def __init__(self, name, score):
self.__name = name #私有变量,此时外部不可通过实例.__name访问
self.__score = score
def print_score(self):
print("%s: %s" % (self.name, self.score))
关于__init__方法
(1)第一个参数永远是self((不可缺少!)),表示创建的类实例本身,绑定属性
(2)有了__init__方法,就不能传入空参数,必须传入与__init__方法匹配的参数,
但self不需要传,Python解释器会自己把实例变量传进去;
其他方法
(1)定义的时候第一参数永远是类的本身实例变量self(不可缺少!!),调用时候不用传该参数
(2)参数可以用默认参数、可变参数或者关键字参数(*args是可变参数,args接收的是一个tuple,
**kw是关键字参数,kw接收的是一个dict)
变量名类似__xxx__以双下划线开头,并且以双下划线结尾的,是特殊变量,不是private变量,可直接访问
创建实例(方法为类名+())
🕐sturent=Student( )
🕑student=Student('ZhangSan',99)
补充:关于self的作用说明
#self代表的是类的实例。
#self.__class__则指向类
class Test:
def ppr(self):
print(self) #<__main__.Test object at 0x000000000284E080>
print(self.__class__) #<class '__main__.Test'>
t = Test()
t.ppr() #此时定义一定要有self
Test.ppr() #此时定义和调用时均不传类实例是可以的,这就是类方法。
在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。
class Parent:
def pprt(self):
print(self)
class Child(Parent):
def cprt(self):
print(self)
c = Child()
c.cprt()
c.pprt()
p = Parent()
p.pprt()
运行结果
<__main__.Child object at 0x0000000002A47080>
<__main__.Child object at 0x0000000002A47080>
<__main__.Parent object at 0x0000000002A47240>
运行c.cprt()时应该没有理解问题,指的是Child类的实例。
但是在运行c.pprt()时,等同于Child.pprt©,所以self指的依然是Child类的实例,由于self中没有定义pprt()方法,所以沿着继承树往上找,发现在父类Parent中定义了pprt()方法,所以就会成功调用。
在描述符类中,self指的是描述符类的实例(绕晕了,占坑后续)
https://blog.csdn.net/CLHugh/article/details/75000104
封装
(1)访问机制
Python提供的访问控制机制,分别是: public和private;
Python中,如果函数、类方法和属性如果以两个下划线开头,
但是不以两个下划线结束,它就是private的,其他的一切都
是public的。
(2) 对象的独立性:
Python中对象本身不具有独立性,也即对象一定属于某一个类;
(3) 类本身是不是对象?(C++ java类的本身不是对象)
Python中类本身是对象;
(4) 基于类的模型,还是基于对象或原型的模型?(c++ java D)
Python是基于对象的模型;
继承
1.在Python中,所有类都是Object类的子类
2.Python采用两种继承方式,分别是:
普通继承方式;
super继承方式(贪婪继承);在super机制里可以保证公共父类仅被执行一次。
class A:
def test(self):
print('test')
class B(A): #继承
pass
b=B()
b.test()
class A:
def test(self):
print('test')
class B(A):
def test(self):
#A.test(self) #调用父类方法
super(B,self).test() #super方式
b=B()
b.test
super在项目中的实际以用,以urlib库为例
https://www.cnblogs.com/xiamaojjie/p/11977151.html