【Python进阶(三)】——面向对象编程

简介: 【Python进阶(三)】——面向对象编程

【Python进阶(三)】——面向对象编程,建议收藏!

该篇文章首先利用Python展示了其面向对象编程的特性,包括类的定义方法;类中的特殊方法;类之间的集成关系;私有属性极@property装饰器;self和cls;new与init的区别和联系等内容。

1 类的定义方法

 运行程序:

class Person:
    nationality = 'China'  #将国际定义为public属性
    _deposit=10e10  #python受保护属性名用一个下划线开始
    __gender="M" #python私有属性名用两个下划线开始
    
    def __init__(self, name, age):
        self.name = name 
        age = age 
    
    def say_hi(self):
        print(self.name)
p1 = Person('Tom', 30)#新建一个新对象并对此进行初始化后得到一个实物p1
p1.say_hi()
##__init__():初始化函数
##__new__():构造新函数
##__del__():析构函数

  运行结果:

Tom

2 类中的特殊方法

  运行程序:

class Person:
    """
      此处为类Person的docString
      
    """
    nationality = 'China' 
    _deposit=10e10
    __gender="M"
    
    
    def __init__(self, name, age):   
        age = age  #age为函数__init__中的局部变量
        self.name = name 
    
    def say_hi(self):
        print(self.name)
    @classmethod  #类方法的定义方法
    def class_func(cls):
        cls.nationality = 'CHINA'
        print('I live in {0}'.format(cls.nationality))
    @staticmethod #静态方法的定义方法
    def static_func(x, y):
        print(x+y)
        
p1 = Person('Tom', 20)
p1.say_hi()
Person.static_func(200,300) 
Person.class_func()
p1.class_func()

  运行结果:

Tom
500
I live in CHINA
I live in CHINA

3 类之间的集成关系

  运行程序:

class Teacher(Person):  #表示类方法之间的继承关系:在定义一个类时候,将其父名放在类之后的括号中
    pass
t1=Teacher("zhang",20)
Person.class_func()
t1.class_func() 
t1.static_func(1,10)
Person.static_func(2,10)
t1._deposit
t1.__gender #子类不能继承父类的private属性

  运行结果:

I live in CHINA
I live in CHINA
11
12
100000000000.0

异常信息:

AttributeError                            Traceback (most recent call last)
<ipython-input-73-6ae6e94e243e> in <module>
      8 Person.static_func(2,10)
      9 t1._deposit
---> 10 t1.__gender #子类不能继承父类的private属性
        global t1.__gender = undefined
     11 get_ipython().run_line_magic('pinfo', 'Person')
     12 get_ipython().run_line_magic('pinfo', 'Teacher')
AttributeError: 'Teacher' object has no attribute '__gender'

运行程序:

Person?#查看父类的docString
Teacher?#查看类的docString
Person.__name__ #获取类名
Person.__doc__ #获取类中字符串
Person.__bases__ #获取类所有父类组成的元组
Person.__dict__ #获取类所有属性和方法组成的类别
Person.__module__ #获取类所在的模块名
Person.__class__ #获取实例所对应的类

  运行结果:

'Person'
'\n      此处为类Person的docString\n      \n    '
(object,)
mappingproxy({'__module__': '__main__',
              '__doc__': '\n      此处为类Person的docString\n      \n    ',
              'nationality': 'CHINA',
              '_deposit': 100000000000.0,
              '_Person__gender': 'M',
              '__init__': <function __main__.Person.__init__(self, name, age)>,
              'say_hi': <function __main__.Person.say_hi(self)>,
              'class_func': <classmethod at 0x2c94b2d2470>,
              'static_func': <staticmethod at 0x2c94b2d2358>,
              '__dict__': <attribute '__dict__' of 'Person' objects>,
              '__weakref__': <attribute '__weakref__' of 'Person' objects>})
'__main__'
type

4 私有属性及@property 装饰器

  运行程序:

class Student:
    __name="Zhang" #私有变量
    age=18#公共变量
    @property#将方法或函数以属性的方式调用
    def get_name(self):
        print(self.__name) 
      
stdnt1=Student()  #用@property装饰器装饰的函数的调用不能加(),必须通过属性的方式调用
   
stdnt1.get_name

  运行结果:

Zhang

5 self 和 cls

  运行程序:

class Student:
    age=0
    name="z"
    def __init__(self):         #在定义一个类时,self代表的是实例的引用
        self.name="zhang" 
        age=10 
s1=Student()
s2=Student()
s1.name="song"
s1.age=30
Student.age=20 
Student.name="li" 
s1.name, s1.age,s2.name, s2.age

  运行结果:

('song', 30, 'zhang', 20)

5 new与init的区别和联系

  运行程序:

class Student:
    name="wang"
    __age=16
    
    def __new__(cls,name,age): 
        print('new函数被调用')
    def __init__(self,name,age):  
        print( 'init函数被调用')
        self.name = name
        self.age = age
    def sayHi(self):
        print(self.name,self.age)
        
s1= Student("zhang", 18)
print(s1)#因为__new__()没有return,所以导致s1中的值为NoneType
s1.sayHi()

  运行结果:

new函数被调用
None
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-88-f90fbe733407> in <module>
     15 s1= Student("zhang", 18)
     16 print(s1)
---> 17 s1.sayHi()
        global s1.sayHi = undefined
AttributeError: 'NoneType' object has no attribute 'sayHi'

  运行程序:

class Student:
    name="wang"
    __age=16
    
    def __new__(cls,*args, **kwargs):
        print('new函数被调用')
        return object.__new__(cls)  
    def __init__(self,name,age):
        print( 'init函数被调用')
        self.name = name
        self.age = age
        
    def sayHi(self):
        print(self.name,self.age)
        
s1= Student("zhang", 18) 
s1.sayHi()#当__new__()中return执行后,才会执行__init__()
#执行函数__new__()生成对象,执行函数__init__()生成实例

  运行结果:

new函数被调用
init函数被调用
zhang 18


相关文章
|
14天前
|
Python
Python编程作业五:面向对象编程
Python编程作业五:面向对象编程
43 1
|
14天前
|
网络协议 Linux Python
Python进阶---网络编程
Python进阶---网络编程
32 2
|
14天前
|
Python
Python进阶---闭包和装饰器
Python进阶---闭包和装饰器
27 2
|
1天前
|
Python 数据安全/隐私保护 开发工具
练手必备!Python编程实战—23个有趣的实战项目带你快速进阶
Python的练手项目有哪些值得推荐? 已经有6.4W关注,700W次浏览,回答都有450条了,本来遇到这种问题我是不会回答的,毕竟已经有太多人给出了答案,我再去回答就没什么意义了。 但想了想确实有很多刚学Python的并不清楚从哪里去找项目来练手,于是就有了这篇文章,基于这个目的,我也是找了好久,最后还是选择了分享这份手册,毕竟里面有细致的讲解,确实更适合练手一些。
|
4天前
|
Python 容器
GitHub狂揽6700 Star,Python进阶必备的案例、技巧与工程实践
当下是 Python 急剧发展的时代,越来越多的人开始学习和使用Pyhon,而大家也遇到了各种问题。这份手册清晰、细致地介绍了 Python 代码应该遵循的编程风格,并解释了背后的原理和机制。 入门 Python 语言相对简单,但写出优雅的代码并非易事。这份手册深入讲解了 Python进阶知识的方方面面,并配以许多有趣的案例故事,使读者能更轻松地理解各种原理,并更好地将其运用于日常工作。
|
6天前
|
存储 Java 程序员
Python中的面向对象编程(OOP)详解
Python中的面向对象编程(OOP)详解
14 0
|
10天前
|
存储 程序员 数据安全/隐私保护
Python面向对象编程:核心概念与实践
Python面向对象编程:核心概念与实践
|
14天前
|
算法 Java 程序员
Python面向对象编程
Python面向对象编程
16 1
|
14天前
|
JSON JavaScript API
Python进阶---FastAPI框架
Python进阶---FastAPI框架
38 2
|
14天前
|
数据安全/隐私保护 Python
Python进阶---正则表达式
Python进阶---正则表达式
12 2