面向对象

Python面向对象基础知识

目录

Python面向对象基础知识

类的定义

构造函数

类变量和实例变量

self和实例方法

类方法

成员的可见性

 (没有什么绝对私有???)

 面向对象三大特性(继承,封装,多态)之继承


类的定义

class Student():
    name = ""
    age = 0

    def print_student(self):
        print("name" + self.name)

(类中的函数必须传入self参数,对类中的属性的调用必须使用self。)(静态方法除外)

构造函数

  • 初始化类的各种特征。
  • 构造函数的执行是在类实例化时自动进行的。
  • 构造函数也可以显式调用,但通常不这么做。​​​​​​
    • (显示调用时返回的只能是None。)
      class Student():
          # 构造函数
          def __init__(self):
              
              pass
      
      stu = Student()
      a = stu.__init__()
      
      # None
  • 使用构造函数来创建不同的对象。 
def __init__(self, name, age):
    self.name = name
    self.age = age

# 实例化时必须传入相应的name和age。
stu = Student("Alice", 16)

类变量和实例变量

  • 类变量
    • 访问
      class Student():
          sum = 0
          age = 0
          name = ""
      
      # 访问:
      Student.name 

       

    • 类变量的使用方法
      class Student():
      	count1 = 0
      	
      	#(其它的实例方法中也可以操作)
      	def __init__(self):
      		#(每初始化一个学生类对象,学生数加一)
      		self.__class__.count1 += 1
      		print("学生总数为:" + str(self.__class__.count1))

       

  • 实例变量
    • class Student():
      	# 类变量
          name = ""
          
          def __init__(self, name):
              # 实例变量
      		self.name = name
      
      # 访问:
      stu = Student("Alice")
      stu.name
      
      stu.__dict__   
      # {"name":"Alice"}

       

    • class Student():
          name = ""
      
          def __init__(self, name):
              name = name     
      		# ""
      		# 会先找到类变量
      
      stu1 = Student("Alice") 
      stu1.__dict__      
      # 查看实例对象的所有变量,也可以查看类   
      	# {}返回一个空字典

       

 

self和实例方法

  • def __init__(this, name):
        # self也可以使用其它名称

     

  • 实例方法 

    • class Student():
              
          def __init__(self, name):
              # 实例方法中访问实例变量和类变量
              self.name = name
              
      		# 此处的name读取的是实例变量
              print(self.name) 
      		# 此处的name读取的是形参name
              print(name)        
      
      stu1 = Student("Alice") 
      # "Alice"
      
      # "Alice"   
      # (实例化对象时传过来的形参是"Alice")
      class Student():
              
          def __init__(self, name1):
              self.name = name1
              
              # 此处的name读取的是实例变量
              print(self.name)   
              # 此处的name读取的是形参name    
              print(name)        
      
      stu2 = Student("Jack")
      # "Jack"
      # 报错,not defined(形参名为name1,所以形参名name找不到)
      

       

    • 实例方法访问类变量
      • class Student():
            count1 = 0
                
            def __init__(self, name):
                
                self.name = name
               
                # 实例方法访问类变量第一种方式
                print(Student.count1)
        		# self.__class__指定当前类
                # 实例方法访问类变量的第二种方式
                print(self.__class__.count1)

类方法

  • 通常用来操作类变量。

  • 类方法访问不到实例变量,self找不到。

    • class Student():
      	sum1 = 0
      
      	# 通过装饰器构造类方法
      	@classmethod
      	def plus_sum(cls):
      		# 约定使用cls名称,其它也可以
      		cls.sum1 += 1
      
      		print(cls.sum1)
      
      # 通过类执行类方法
      Student.plus_sum()
      
      # 可以通过对象来执行类方法,不会报错,但不建议这么做,逻辑不通
      # 也可以正确的返回结果
      stu1 = Student()
      stu1.plus_sum() 

       

  • 基本上和类方法没有区别,没有显式的定义类似于self,cls的形参变量。

  • 访问不到实例变量,找不到self。

  • 需要通过类名来访问类变量。

  • 可以操作一些与类关联较弱的属性,不建议经常使用。

    • class Student():
      	count1 = 0
      
      	@staticmethod
      	def static_method(x,y):
      		Student.count1 += 1
      
      		print(Student.count1)

       

成员的可见性

  • 对于类中变量的操作都应该通过方法来实现。
  • 通过在变量或方法名称前面加上"__"双下划线来将变量或方法私有。
  • 不要自作多情在前后都加双下划线,类似于"__function_var__"。 
    • class Student():
      	__sum1 = 0   
          # __sum1为类私有,类外访问不到
      
      	def __init__(self):
      		pass
      class Student():
      	# 动态语言特性
      		
      	def __init__(self):
      		# 将__score私有
      		__score = 0   
      
      stu1 = Student()
      
      stu1.__score = -1 
      print(stu1.__score)
      #(此处并不会报错,
      # 什么?我们既可以对"__score"赋值还可以访问,"Excuse me???")
      
      #(注意:此'__score'非彼'__score')
      #(由于Python动态语言的特性,通过'stu1.__score = -1'操作实际上是stu1对象新增了__score对象,所
      # 以我们才访问得到)
      
      stu2 = Student()
      print(stu2.__score)  
      #(报错啦!!!)
      #(stu2对象并没有新增__score属性)

 (没有什么绝对私有???)

class Student():
	
	def __init__(self, name):
		__score = 0

		self.name = name

stu1 = Student("Alice")
#(通过__dict__属性来查看stu1对象下的变量)
print(stu1.__dict__)
#	{
#		"name":"Alice",
#		"_Student__score":0,       
#	}
#(可以看到Python实现私有的方式是该变量名称。(下划线+类名+双下划线的私有变量名))
#(所以我们仍可以在类外通过"_Student__score"来访问更改私有变量,)

 

 面向对象三大特性(继承,封装,多态)之继承

class Human():

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

class Student(Human):

    def __init__(self, school, name, age):

        self.school = school
        # 类加实例方法,这种调用很奇怪,逻辑上讲不通,但Python并不会报错,
        # Human.__init__(self, name, age)
        super(Student, self).__init__(name, age)
        # print(school + name + str(age))

stu1 = Student("一中", "Alice", 18)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值