python --面向对象

面向对象 :详解 

  1. 类(class) :用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例
  2. 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用
  3. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据
  4. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也成为了方法的重写。
  5. 局部变量:定义在方法中的变量,只作用于当前实例的类。
  6. 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是咋类的其他成员方法之外声明的。
  7. 继承:极易个派生类继承基类的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
  8. 实例化:创建一个类的实例,类的具体对象。
  9. 方法:类中定义的函数
  10. 对象:通过类定义的数据结果实例。对象包括两个数据成员(类变量和实例变量)和方法。
  • 简单的一个实例:
    • class Test:     #类定义
          i = 123     #直接在类中放属性和属性值
          def fn(name):
              #print("输入的名字是:", name)
              return 'hello,wolrd'
              
      x = Test()      #实例化该类
      #访问该类的属性
      print("Test这个类中i的值为:", x.i)            #Test这个类中i的值为: 123
      #x.fn(cassie) 这样调用类中的函数会报错?
      #访问该类的方法
      print(x.fn())

  •  _init_() ---构造方法(init前后分别为_ _两个下划线,否则会报错),由于很多类都倾向于将对象创建为有初始状态的,所以类可能会定义一个_int_()    

    • def _init_(self):
          self.data = []
  •   错误提示TypeError: Complex() takes no arguments-----不接收任何参数
  • 类的方法:
    • 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数:
class People:
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    def __str__(self):
    	return self.__weight
    #定义构造方法
    def __init__(self, n, a, w):      #self为实例化本身,类似于js的this
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说:我 %d 岁。"%(self.name, self.age))   
  
        '''
        ("%s 说:我 %d 岁。")此时的%s和%d均为参数,行参,需要在后面给他加上实参,需要加%
        比如("%a 前面为要传入的参数,后面这个是传入的实参"%(self.name ###此时就是实参))
        '''
    	
#实例化
p = People('cassie', 10, 3)
p.speak()
class People:
	name = ''
	age = 0
	sex = 'f'
	def __str__(self):      #把名字直接展示出来,在直接print实例化对象时
		return self.name	
	
	def __init__(self, name):  #接收参数
		self.name = name       #修改上面的name属性的值
		#print('this is start')
		
	def like_apple(self):    #需要调用此函数
		if self.sex == 'f':
			print('女性爱吃苹果')
		elif self.sex == 'n':
			print('男性不爱吃苹果')
		else:
			print('没有性别,无法判断')
		print(self.name, self.age)
			
a = People('cassie')   #实例化       
a.like_apple()       #调用自己写的函数
'''
输出结果为:

女性爱吃苹果
cassie 0
'''
print(a)   #因为上面写了__str__这个方法,所以在print时,直接返回了名字 
  • 继承:
    • BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
#定义一个主类
class people:
    name = ''
    age = 0
    
    def __init__(self):
        self.name = name
        self.age = age

    def speak(self):
        print("%s 说:我%d 岁了。"%(self.name, self.age))


#继承实例,在定义一个类来继承主类
class student(people):
    grade = ''
    
    def __init__(self,name, age, grade):
        people.__init__(self, name,age)
        self.grade = grade

    #复写父类的方法:
    def speak(self):
        print("%s 说:我今年%d 岁了,上 %d 年级"%(self.name, self.age, self.grade))

#初始化类
s = student('cassie', 10, 3)
#调用该类的方法
s.speak()     

#######输出结果为
cassie说我10岁了,上3年级
  • 多继承
    • 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,Python 从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
    • class Example(Lei1,Lei2)
#定义一个主类
class People:
    name = ''
    age = 0
    
    def __init__(self):
        self.name = name
        self.age = age

    def speak(self):
        print("%s 说:我%d 岁了。"%(self.name, self.age))


#继承实例,在定义一个类来继承主类
class Student(people):
    grade = ''
    
    def __init__(self,name, age, grade):
        People.__init__(self, name,age)
        self.grade = grade

    #复写父类的方法:
    def speak(self):
        print("%s 说:我今年%d 岁了,上 %d 年级"%(self.name, self.age, self.grade))



#在定义一个父类
class Speaker():
    name = ''
    language = 'c'

    def __init__(self, name, language):
        self.name = name
        self.language = language

    def speak(self):
        print("我叫%s ,我说%d 语言"%(self.name, self.language))

#多继承
class More(Speaker,Student):
    a = ''
    def__init__(self, name, age, grade, language):
        Student.__init__(self, name, age, grade)
        Speaker.__init__(self, name, language)

test = More('liu', 10, 3, '中文')
test.speak()        #因为这两个类中的方法均定义为speak,所以在调用方法时,默认调用前面父类的方法,所以调用的是Speaker这个类中的方法

######输出结果为
我叫刘,我说中文语言


  • 方法重写
    • 在继承时,父类的方法不满足需求时,可以在子类中重写父类中的方法:
class Parent:
    def method(self):
        print('调用父类的方法')

class Child(Parent):
    def method(self):       #此时重写了父类中的method这个方法
        print('调用子类的方法')

c = Child()
c.method()

###输出结果为
调用子类的方法
  • 类属性与方法:
    • 类的私有属性:
      • __private_attrs(__weight):两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用方法为:self.__pricate_attrs(self.__weight)
    • 类的方法
      • 在类的内部,使用def关键字为类定义一个方法,接收的参数第一个参数必须为self(初始化的类本身)
    • 类的私有方法
      • __method:两个下划线开头,声明该方法只在该类内部使用,还用方法为self.__method
class Test:
    __siyou_variable = '私有变量'
    name = '公开变量'

    def method(self):
        print(self.__siyou_variable)     #私有变量
        print(self.name)                 #公开变量

d = Test()
d.method()      #初始化类之后,调用类的方法
print(d.name)     #直接输出类中的指定属性的属性值
print(d.__siyou_variable)           #此时为私有属性,不能直接输出结果,所以会报错


####一次输出结果为
私有变量
公开变量

公开变量
Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print (d.__siyou_variable)  # 报错,实例不能访问私有变量
AttributeError: 'Test' object has no attribute '__siyou_variable'


  • 类的专有方法:
    • __init__:构造函数,在生成对象是调用
    • __del__:析构对象,在释放对象时使用
    • __repr__:打印,转换
    • __setitem__:按照索引赋值
    • __getitem__:按照索引取值
    • __len__:获得长度
    • __cmp__:比较运算
    • __call__:函数运算
    • __add__:加运算
    • __sub__:减运算
    • __mul__:乘运算
    • __div__:除运算
    • __mod__:求余运算
    • __pow__:乘方
  • 运算符重载    
    class Vector:
        def__init__(self, a, b):
            self.a = a
            self.b = b
    
        def __str__(self):
            return 'Vector (%d, %d,)'%(self.a, self.b)
    
        def __add__(self):
            return Vector(self.a + other.a, self.b + other.b)
    
    v1 = Vector(2,10)
    v2 = Vector(5,-2)
    print(v1 + v2)
    
    ##输出结果为
    Vector(7,8)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值