类中的成员

类中的成员:字段、方法、属性

1、字段

字段:普通字段、静态字段

1 class Mycalss:
2     str = ‘这是静态字段‘
3     def __init__(self,str1):
4         self.str1 = str1 # 普通字段
5 # 实例化对象
6 a = Mycalss(‘普通字段‘)
7 print(a.str1) #访问静态字段
8 print(Mycalss.str)

执行结果

普通字段
这是静态字段

  普通字段:属于对象,由对象来访问,在内存中每个对象都要保存一份

  静态字段:属于类,由类直接访问,在内存中只保存一份

2、方法

方法:普通方法、静态方法、类方法

 1 class Myclass(object):
 2     doc = ‘静态字段‘
 3     def __init__(self, argu1, argu2 ,):
 4         self.argu1 = argu1
 5         self.argu2 = argu2
 6     def func1(self):  #普通方法 至少一个self
 7         print(‘普通方法‘)
 8     @staticmethod # 静态方法,任意参数
 9     def func2():
10         print(‘静态方法‘)
11     @classmethod  #类方法,只能一个cls
12     def func3(cls):
13         print(‘类方法‘,cls)#执行时它会把当前的类当成参数传进去14 # 创建对象 15 c = Myclass(123, ‘hello world‘)16 c.func1() #访问普通方法

执行结果:

普通方法
静态方法
类方法 <class ‘__main__.Myclass‘> #执行时它会把当前的类当成参数传进去

普通方法:先创建一个对象,在用对象去调用这个方法

静态方法:直接用类调用,可以有任意参数(静态方法可以让类直接调用,省去了普通方法创建对象的步骤)

类方法:直接用类调用,只能一个cls参数

3、属性

属性定义两种方法:装饰器定义、静态字段定义

(1)装饰器定义属性

 1 class Myclass(object):
 2     doc = ‘This is a test‘
 3     def __init__(self,argu):
 4         self.argu = argu
 5     def func1(self):#方法
 6         print(‘方法‘)
 7     @property
 8     def func2(self):  #属性,加上@property装饰器,仅有一个self参数
 9         print(‘属性‘)
10 #创建对象
11 a = Myclass(2222)
12 a.func1()  #调用方法
13 a.func2 # 调用属性 执行结果>>>
15 方法
16 属性

在方法上加上@property装饰器就叫属性,属性和方法的区别就是调用时不用加括号

在新式类中,除了@property,还有另外两种装饰器

 1 class School(object):
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5     @property
 6     def classroom(self):    # 属性,加上@property装饰器,仅有一个self参数
 7         print(self.name, self.age)
 8     @classroom.setter
 9     def classroom(self, age):
10         self.age = age    # 把age修改为传入的参数
11         print("修改", self.name, self.age)
12     @classroom.deleter
13     def classroom(self):
14         del self.age        # 删除age
15         print("删除", self.name, self.age)
16
17 # 创建对象a1
18 a1 = School("张三", 18)
19 a1.classroom    #1.执行后会自动调用@property方法
20 a1.classroom = 20     #2.执行后会自动调用@classroom.setter的方法,并将20传给age参数
21 del a1.classroom    #3.执行后会自动调用@classroom.deleter的方法

执行结果

张三 18
Traceback (most recent call last):
修改 张三 20
  File "E:/Python-Advanced/面向对象/类中的成员/属性/装饰器1.py", line 21, in <module>
    del a1.classroom    #3.执行后会自动调用@classroom.deleter的方法
  File "E:/Python-Advanced/面向对象/类中的成员/属性/装饰器1.py", line 15, in classroom
    print("删除", self.name, self.age)
AttributeError: ‘School‘ object has no attribute ‘age‘

(2)静态字段定义的属性

 1 class School(object):
 2     def __init__(self,name,age):
 3         self.name=name
 4         self.age=age
 5
 6     def classroom(self):
 7         print(self.name,self.age)
 8
 9     def classroom_update(self,age):
10         self.age=age    #把age修改为传入的参数
11         print("修改",self.name,self.age)
12
13     def classroom_del(self):
14         del self.age        #删除age
15         print("删除",self.name,self.age)
16
17     obj=property(classroom,classroom_update,classroom_del)  #静态字段方式定义属性
18
19 #创建对象a1
20 a1=School("张三",18)
21 a1.obj  #1.执行后会自动调用classroom方法
22 a1.obj=20     #2.执行后会自动调用classroom_update的方法,并将20传给age参数
23 del a1.obj    #3.执行后会自动调用classroom_delr的方法

4、公有成员和私有成员

在类中的每一个成员都有两种形式:公有、私有

公有:都可以访问      私有:只有在类的内部可以访问

举例——字段:

 1 class School(object):
 2     deg="狗" #公有静态字段
 3     __cat="猫"   #私有静态字段
 4     def __init__(self,name,age):
 5         self.name=name  #公有普通字段
 6         self.__age=age  #私有普通字段
 7
 8     def dormitory(self):
 9         print(self.__age)
10
11     def cat(self):
12         print(School.__cat)
13
14 #创建对象a1
15 a1=School("张三",18)
16 #访问普通字段
17 print(a1.name)  #输出:张三
18 print(a1.age)   #报错,提示没有age,因为age是私有字段,只能间接内部访问
19 a1.dormitory()  #只能通过类内部访问私有字段
20 #访问静态字段
21 print(School.deg)   #输出:狗
22 print(School.__cat) #报错
23 a1.cat()        #输出:猫   可以间接通过内部的cat方法反问私有静态字段

方法

 1 class School(object):
 2
 3     def __init__(self, name, age):
 4         self.name = name
 5         self.__age = age
 6
 7     def cat(self):  # 公有方法
 8         print("cat")
 9
10     def __dog(self):   # 私有方法
11         print("dog")
12
13     def doo(self):  #内部访问私有方法
14         a1.__dog()
15 #创建对象a1
16 a1 = School("张三",18)
17 a1.cat()    #输出:cat
18 # a1.__dog()    #报错
19 a1.doo()    # 输出:dog  间接通过doo方法反问私有方法__dog20 a1._School__dog() # 强制访问

如果想要强制访问私有字段,可以通过(对象._类名__私有字段名)访问,不建议强制访问私有成员。

5、类的特殊成员

(1)__doc__

1 class Myclass(object):
2     ‘‘‘类的描述信息‘‘‘
3     def __init__(self, argu):
4         self.argu = argu
56 print(Myclass.__doc__) #输出:类的描述信息

(2)__init__

  在上面已经说过,在创建对象是自动执行

(3)__del__

当对象在内存中被释放时,自动触发执行

1 class Myclass(object):
2     ‘‘‘类的描述信息‘‘‘
3     def __init__(self, argu):
4         self.argu = argu
5     def __del__(self):
6         print(‘对象内存已被释放‘)
7
8 a = Myclass(‘hello world‘)
9 print(a.argu)

执行结果:

hello world
对象内存已被释放

(4)__call__

在创建的对象后面加括号执行时,会自动执行类里的__call__方法

1 class Myclass(object):
2
3     def __call__(self, *args, **kwargs):
4         print("触发__call__方法")
5
6 a1=Myclass()
7 a1()    #输出:触发__call__方法
8 Myclass()()  #输出:触发__call__方法

(5)__dict__

获取类或对象的所有成员

class School(object):
    """类的描述信息"""
    cat="猫"
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    def dog(self):
        print("dog")

print(School.__dict__)  #获取类中的成员
a1=School("张三",18)
print(a1.__dict__)  #获取对象中的成员
‘‘‘
输出:
{‘cat‘: ‘猫‘, ‘__init__‘: <function School.__init__ at 0x000000000226C950>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘School‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘School‘ objects>, ‘__module__‘: ‘__main__‘, ‘dog‘: <function School.dog at 0x000000000226CAE8>, ‘__doc__‘: ‘类的描述信息‘}
{‘name‘: ‘张三‘, ‘_School__age‘: 18}
‘‘‘

(6)__str__

1 class School(object):
2     def __init__(self,name,age):
3         self.name=name
4         self.__age=age
5
6     def __str__(self):
7         return("print对象时的返回值")
8 a1=School("张三",18)
9 print(a1)   #输出:print对象时的返回值

原文地址:https://www.cnblogs.com/weststar/p/11420865.html

时间: 2024-10-09 11:11:08

类中的成员的相关文章

java类中各成员初始化的顺序

了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println("父类代码块初始化" ); } private static String s=print(); public static String print() { System. out.println

学习IOS开问题篇--类中的成员变量如果不实例化是什么情况

@interface Person : NSObject @property (noatonmic,copy) NSString * name; @end 一个person类,name是person得成员变量 如果在一个类中写入person为成员变量 self.person.name = @"zhangsan"; 如果前面不将person实例化,实际上是在对一个空指针进行操作 [nil setname:@"zhangsan"]; 因为oc中对空指针发消息不会报错,所

c++ 类中模版成员函数

C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 template <class T>//类模版 class CTemplate{ public: void SWap(T &first, T &second){ } }; #include <iostream> class Single{ public: static Single

C#类中的成员

@ 目录 字段 属性 方法 构造函数 类和对象的简单解释 创建类和对象 类中成员的归属问题 字段 字段的声明与声明变量类似,可以添加访问修饰符,通常情况下字段设置为私有的,然后定义属性对字段的读写进行限制 一般的命名规范约定,私有字段使用下划线前缀.小驼峰命名 private int _age //定义一个私有字段_age 属性 属性拥有两个访问器(get和set),用于控制读取和写入,通常和字段配套使用,用来对字段进行读写限制 //定义一个Age属性,限制赋值给_age字段的值为18到60岁之

Java继承类中static成员函数的重写

在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行. 也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性.让我们测试一下: 1 class testClass1{ 2 static void SMothod(){ 3 System.out.println("static in testClass1"); 4 } 5 } 6 class testClass2 extends

第十六周oj刷题——Problem I: 改错题:类中私有成员的访问

Description 改错题: 设计一个日期类和时间类,并编写全局函数display用于显示日期和时间.要求:display函数作为类外的普通函数,而不是成员函数 在主函数中调用display函数,display函数分别引用Time和Date两个类的对象的私有数据,输出年.月.日和时.分.秒. Input 年      月       日 时      分       秒 Output 年/月/日 时:分:秒 Sample Input 2013 12 23 14 23 50 Sample Ou

第十六周oj刷题——Problem I: 改错题:类中私有成员的訪问

Description 改错题: 设计一个日期类和时间类,并编写全局函数display用于显示日期和时间. 要求:display函数作为类外的普通函数,而不是成员函数 在主函数中调用display函数.display函数分别引用Time和Date两个类的对象的私有数据.输出年.月.日和时.分.秒. Input 年      月       日 时      分       秒 Output 年/月/日 时:分:秒 Sample Input 2013 12 23 14 23 50 Sample O

同一个包,同一个类中,成员变量与成员方法的调用!

分析范围:/**同一个包,同一个类中: * 注意:eat1与eat2是方法的重载(方法名相同,参数列表不同与返回值类型无关) * 在同一个.java文件中可以写多个类,但是只能有一个public修饰的类 * 同一个类中同类型的(静态与非静态)方法之间可以相互调用,例如eat()与sleep(); * 方法1与方法2之间只能调用方法,方法1无法调用方法2里面的变量(局部变量只在方法体中使用); * 静态函数(main方法)不能直接调用非静态成员属性和成员方法; * 静态函数(main方法)可以通过

1.类中数据成员的声明与初始化总结

在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样 class A   { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字 为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的. 什么东西能在类内初始化 能在类中初始化的成员只有一种,那就是静态常量成员. 这样不行 class A